为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中实现可调整大小的数组

如何在Go中实现可调整大小的数组

Go
守着一只汪 2021-04-08 16:15:41
我来自C ++背景,并且习惯于使用std::vector此类的东西。假设我想要这些的动态数组:type a struct {    b int    c string}这样做的标准方法是什么?
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

使用append()内置


例子:


type mytype struct {

  a, b int

}


func main() {

  a := []mytype{mytype{1, 2}, mytype{3, 4}}

  a = append(a, mytype{5, 6})

}


查看完整回答
反对 回复 2021-04-26
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

Go Slice包含三个元素:数据,长度和容量。


s := make([]int, 0, 10)

变量s是一个整数切片,其长度为0,容量为10。内置的len()和cap()函数允许您获取切片的长度和容量:


len(s) == 0

cap(s) == 10

要增加切片的长度,只需重新切片:


s = s[0:5]

// len(s) == 5

// cap(s) == 10

要减少长度,可以采用子切片:


s = s[0:1]

// len(s) == 1

有一些较短的方法可以调用make():


a := make([]int, 10) 

// len(a) == cap(a) == 10


b := make([]int)

// len(b) == cap(b) == 0

一切都很好,但是如果您需要将切片的长度增加到超出其容量,该怎么办?为此,您需要分配一个新的片并将旧片的内容复制到新的片上。(函数“ copy”是另一个内置函数。)


t := make([]int, len(s), 20)

copy(t, s)

在有效围棋文档需要这个例子有点进一步,实现一个附加功能追加一个切片到另一个,调整其大小,如果必要的。


切片由数组支持;当make()一片特定容量的切片时,该容量的数组将在后台分配。切片实际上成为该数组的“智能指针”。如果将该切片(或该切片的子切片)传递给另一个函数,则它将作为指向同一数组的指针传递。这使得子切片的创建非常便宜-昂贵的是后备阵列的分配。


Go标准库包含许多容器软件包(例如vector),从而无需手动管理切片。使用切片可以提高速度,而使用更精细的容器类可以更加方便。(也就是说,大多数情况下我仍然使用切片。)


您可能想知道为什么需要处理所有这些麻烦。毕竟,许多语言都提供动态调整大小的数组作为基元。这样做的原因与Go的哲学息息相关。语言设计人员不会假定您知道适合您的程序的分配策略是什么;相反,它们为您提供了构建自己的数据结构所需的工具。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 382 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信