猿问

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

有没有办法在 go 中创建一个不固定长度的切片?例如,我想获取目录中的所有文件名(content/)填充到一个[] string切片中。


该content/目录包含:


$-> tree content/

content/

├── 1.txt

├── 2.txt

└── tmp

这是我目前得到的:


package main


import (

    "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 可以做到这一点吗?


喵喔喔
浏览 218回答 3
3回答

慕斯王

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}

临摹微笑

要从 的切片生成名称的切片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}

长风秋雁

是的,您可以创建一个空切片并使用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 copiedlist = append(list, "foo") // add to it
随时随地看视频慕课网APP

相关分类

Go
我要回答