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

如何在golang中创建一个不固定长度的切片

如何在golang中创建一个不固定长度的切片

Go
喵喔喔 2021-09-10 17:19:57
有没有办法在 go 中创建一个不固定长度的切片?例如,我想获取目录中的所有文件名(content/)填充到一个[] string切片中。该content/目录包含:$-> tree content/content/├── 1.txt├── 2.txt└── tmp这是我目前得到的:package mainimport (    "fmt"    "io/ioutil")func listFile() []string {    list := make([]string, 100)    // as you can see, I make a slice length as 100, but that is not appropriate.    files, _ := ioutil.ReadDir("content")    i := 0    for _, f := range files{        list[i] = f.Name()        i = i+1    }    return list}func main(){    fmt.Print(listFile())}我想要实现的是一种模拟ArrayListjava中行为的方法,我可以简单地不list.add()关心长度。GoLang 中的 slice 可以做到这一点吗?
查看完整描述

3 回答

?
慕斯王

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

Go 切片无法做到这一点,但该append()函数会在追加元素成为O (1) 分摊操作的情况下增大切片:


func listFile() []string {

    // make a slice of length 0

    list := make([]string, 0)


    files, _ := ioutil.ReadDir("content")

    for _, f := range files {

        // append grows list as needed

        list = append(list, f.Name())

    }


    return list

}


查看完整回答
反对 回复 2021-09-10
?
临摹微笑

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

要从 的切片生成名称的切片FileInfo,您不需要像 Java 那样的任何东西ArrayList。


ioutil.ReadDir()返回一个切片FileInfo,您可以使用内置len函数查询其长度:


count := len(files)

所以你可以创建一个数组或切片能够保存这个数量的名称:


func listFile() []string {

    files, _ := ioutil.ReadDir("content")


    list := make([]string, len(files))

    for i, f := range files {

        list[i] = f.Name()

    }


    return list

}


查看完整回答
反对 回复 2021-09-10
?
长风秋雁

TA贡献1757条经验 获得超7个赞

是的,您可以创建一个空切片并使用append. 如果您或多或少知道您期望的平均大小,您可以为它保留一些空间,就像在 Java 的 ArrayList 中一样。这将防止在切片增长时重新分配底层数据。


//make an empty slice with 20 reserved items to avoid 

list := make([]string, 0, 20)reallocation


// now we just append to it. The underlying data is not copied

list = append(list, "foo") // add to it


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

添加回答

举报

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