56 go
我来自C++背景,我习惯使用std::vector类这样的东西.让我们假设我想要一个动态数组:
type a struct {
b int
c string
}
Run Code Online (Sandbox Code Playgroud)
这样做的标准方法是什么?
一个片段非常有用
cth*_*m06 61
使用append()内置
例:
type mytype struct {
a, b int
}
func main() {
a := []mytype{mytype{1, 2}, mytype{3, 4}}
a = append(a, mytype{5, 6})
}
Run Code Online (Sandbox Code Playgroud)
有关追加的更多信息,请参阅规范.
小智 61
Go Slice包含三个元素:数据,长度和容量.
s := make([]int, 0, 10)
Run Code Online (Sandbox Code Playgroud)
变量s是一个长度为0且容量为10的整数.内置的len()和cap()函数允许您获取切片的长度和容量:
len(s) == 0
cap(s) == 10
Run Code Online (Sandbox Code Playgroud)
要增加切片的长度,只需重新切片:
s = s[0:5]
// len(s) == 5
// cap(s) == 10
Run Code Online (Sandbox Code Playgroud)
要减小长度,可以采用子切片:
s = s[0:1]
// len(s) == 1
Run Code Online (Sandbox Code Playgroud)
有一些较短的方法可以调用make():
a := make([]int, 10)
// len(a) == cap(a) == 10
b := make([]int)
// len(b) == cap(b) == 0
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但如果你需要增加切片的长度超出其容量呢?为此,您需要分配一个新切片并将旧切片的内容复制到新切片.("复制"功能是另一种内置功能.)
t := make([]int, len(s), 20)
copy(t, s)
Run Code Online (Sandbox Code Playgroud)
在有效围棋文档需要这个例子有点进一步,实现一个附加功能追加一个切片到另一个,如果有必要调整其大小.
切片由数组支持; 当你使()一个特定容量的片段时,在后台分配该容量的数组.切片有效地成为该阵列的"智能指针".如果将该切片(或该切片的子切片)传递给另一个函数,则将其作为指向同一数组的指针传递.这使得创建子片非常便宜 - 这是后缀阵列的分配,这是昂贵的.
Go标准库包含许多容器包 - 例如vector,它们不需要手动管理切片.为了方便起见,使用切片来提高速度,并使用更复杂的容器类.(说,我仍然使用切片做大多数事情.)
您可能想知道为什么需要解决所有这些麻烦.毕竟,许多语言都提供动态调整大小的数组作为基元.其原因与Go的理念有关.语言设计者不会假设知道适合您的程序的分配策略是什么; 相反,它们为您提供构建自己的数据结构所需的工具.
Jes*_*sta 21
这种惯用的方式已经改变了.添加内置的append()函数意味着您可以像这样扩展切片:
type a struct {
b int
c string
}
func main(){
var mySlice []a
mySlice = append(mySlice,a{5,"pizza"})
}
Run Code Online (Sandbox Code Playgroud)
如果有空间,Append()会将给定项附加到切片,如果切片不够大,则将其扩展.
有关append()的更多信息,请访问http://golang.org/doc/go_spec.html#Appending_and_copying_slices
对于内置的更简单的示例append()
friends := []string{"Adam"}
friends = append(friends, "Rahul") // Add one friend or one string
friends = append(friends, "Angelica", "Rashi") // Add multiple friends or multiple strings
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53503 次 |
| 最近记录: |