我想初始化一个2D数组,其中内部数组的每个成员都包含一个1000 x的字符串。类似的东西:
var data = [num_rows][num_cols]string("x....x(upto 1000)")
但所有谷歌搜索都是徒劳的。在C ++中,我可以实现类似的这样的事情:
vector<vector<string>> data(num_rows, vector<string>(num_cols, string("x",1000)));
在Ruby中就像这样:
Array.new(num_rows) { Array.new(num_cols) { "x"*1000 } }
想要在go中获得类似的结果,但我无法找到任何文档来填充字符串并初始化2D数组。另请注意,我想为数组的每个成员生成字符串,而不是使用可用的字符串。
PS:我也在寻找类似Rust的东西
答案 0 :(得分:2)
在Rust中,它取决于您要使用这些值的内容。我喜欢this answer来创建重复的字符串。 “行”取决于您是否需要引用或复制语义,这些语义在生锈中是明确的。 borrows
向量是一堆借用的字符串,它们引用x_s
拥有的内存。 copies
向量是原始x_s
字符串的一堆内存副本。
use std::iter;
fn main() {
let num_rows = 1000;
let num_cols = 1000;
let x_s : String = iter::repeat('x').take(num_cols).collect();
// pick one of the below
let borrows : Vec<&str> = vec![&*x_s ; num_rows];
let copies : Vec<String> = vec![x_s.clone() ; num_rows];
}
在最后一行调用clone
是因为vec
宏移动了发送到它的值。在vec
的情况下,num_rows
宏也会克隆此克隆copies
次。请注意,在大多数用例中可能不需要此clone
,因为您通常不会同时在同一作用域中使用borrows
和copies
。
作为一个警告,我相当新的生锈,但相信这是一个体面的答案。我很乐意接受更正。
答案 1 :(得分:1)
你可以使用切片。这可能不是最短的解决方案,但它对我有用。
package main
import (
"fmt"
"strings"
)
func main() {
xs := strings.Repeat("x", 1000)
num_rows := 5
num_cols := 5
data := make([][]string, num_rows)
for y := 0; y < num_rows; y++ {
data[y] = make([]string, num_cols)
for x := 0; x < num_cols; x++ {
data[y][x] = xs
}
}
fmt.Printf("%T", data)
fmt.Print(data)
}
答案 2 :(得分:0)
生锈中一个非常简单的在线例子:
fn main() {
let data: Vec<String> = (0..1000).map(|n| (0..n).map(|_| 'x').collect()).collect();
println!("{:?}", data);
}