在GoLang和Rust中初始化字符串数组的数组

时间:2016-06-02 11:21:17

标签: arrays go rust

我想初始化一个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的东西

3 个答案:

答案 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,因为您通常不会同时在同一作用域中使用borrowscopies

作为一个警告,我相当新的生锈,但相信这是一个体面的答案。我很乐意接受更正。

答案 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);
}