回答

收藏

在 Go 中创建 2D 切片的简洁方法是什么?

技术问答 技术问答 209 人阅读 | 0 人回复 | 2023-09-12

我正在学golang。其中一个练习是网友问我创建的2D切片dy行dx包含列uint8.我目前有效的方法是:: k/ b1 K6 ^3 w2 u. a

    4 m  b+ W# {9 c8 A. W9 ]% y
  • a:= make([][]uint8,dy)    initialize a slice of dy slicesfor i:=0;i我认为遍历上的每一个切片都太冗长了。如果切片有更多的维度,代码就会变得笨拙。是否有一个简单的方法来初始化 Go 中的 2D(或 n 维)切片?
    6 s9 ]; O2 S; |% X+ E8 g6 T, `/ S1 o
  •                                                                : K" b, b1 H9 d3 e
  •     解决方案:                                                               
    + H2 G& i' b6 A  @, ]* v' k) e
  •                                                                 没有更简单的方法,你所做的就是正确;因为切片总是一维的,但它们可以结合起来构建更高维度的对象。
    1 Q8 V3 X2 C1 R' J) p4 D/ z$ q4 g
  • 你可以简化的一件事是使用它for range构造:[code]a := make([][]uint8,dy)for i := range a    a = make([]uint8,dx)}) V4 j1 t2 c1 Q1 p
另外,请注意,如果使用复合文始化切片,您可以免费获得它,例如:
. p- S& N, x- x9 {% `1 y5 Z5 L
    ! m; k1 R4 n4 a$ R3 Q' g& t5 l& r
  • a := [][]uint8{    {0,1,2,3},   {4,5,6,7},}fmt.Println(a) // Output is [0 1 2 3] [4 5 6 7]code]是的,这有它的局限性,因为你似乎必须列举所有的元素;但有一些技巧,你不必列举所有值,只是列举不是切片元素类型的零值。  q- \2 ?+ H- ]+ s
  • 例如,如果你想要一个前 10 元素为零的切片,然后跟随1and 2,则可以像这样创建它:[code]b := []uint{10: 1,2}fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 1 2]4 M& ^& E+ r( C. {
请注意,如果您使用数组而不是数组slices,它可以很容易地创建:
/ Q( ?& }5 y) d/ r
    c := [5][5]uint8{}fmt.Println(c)
    1 O6 \% Z, h1 x7 M. P1 |. s0 G
输出是:2 N$ m4 f+ w4 T6 r$ O7 ~4 W
[code][0 00 0 0 0] [0 0 0 00] [0 0 00] [0 0 00] [0 0 0]code]对于数组,您不必经历外部数组并初始化内部数组,因为数组不是描述符,而是值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则