回答

收藏

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

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

我正在学golang。其中一个练习是网友问我创建的2D切片dy行dx包含列uint8.我目前有效的方法是:1 v9 s: J1 \- K
    + A' n6 }& D  k! H* v# F
  • a:= make([][]uint8,dy)    initialize a slice of dy slicesfor i:=0;i我认为遍历上的每一个切片都太冗长了。如果切片有更多的维度,代码就会变得笨拙。是否有一个简单的方法来初始化 Go 中的 2D(或 n 维)切片?( P; N( A- n  m8 X/ M
  •                                                                
    7 O" W3 h4 @5 }5 @8 s
  •     解决方案:                                                               ' g) C" W4 a) M5 \# \4 P  _7 j. s
  •                                                                 没有更简单的方法,你所做的就是正确;因为切片总是一维的,但它们可以结合起来构建更高维度的对象。
    8 Z% M, n& k# \' Z* b! t' D
  • 你可以简化的一件事是使用它for range构造:[code]a := make([][]uint8,dy)for i := range a    a = make([]uint8,dx)}
    . s/ w- H% ?) t  u
另外,请注意,如果使用复合文始化切片,您可以免费获得它,例如:% {$ G6 u. ?9 ~2 J; G
    ( Q: E2 o, k0 W
  • a := [][]uint8{    {0,1,2,3},   {4,5,6,7},}fmt.Println(a) // Output is [0 1 2 3] [4 5 6 7]code]是的,这有它的局限性,因为你似乎必须列举所有的元素;但有一些技巧,你不必列举所有值,只是列举不是切片元素类型的零值。
    - M  ]) J  R+ w- Z6 Y$ C0 N; d
  • 例如,如果你想要一个前 10 元素为零的切片,然后跟随1and 2,则可以像这样创建它:[code]b := []uint{10: 1,2}fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 1 2]9 S# `( l; K% X+ f8 h* o
请注意,如果您使用数组而不是数组slices,它可以很容易地创建:
  i5 ]9 a( G$ O9 _; c
    c := [5][5]uint8{}fmt.Println(c)
    . W5 w! }" U! p8 \/ M2 j, U! [  y; _
输出是:+ i$ p1 C& Y* z+ s4 M5 `
[code][0 00 0 0 0] [0 0 0 00] [0 0 00] [0 0 00] [0 0 0]code]对于数组,您不必经历外部数组并初始化内部数组,因为数组不是描述符,而是值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则