有没有办法在go中创建不固定长度切片?例如,我想抓取目录中的所有fileNames(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())
}
我想要实现的是一种模拟java中ArrayList
行为的方法,我只需list.add()
而不关心长度。
可以在GoLang切片吗?
感谢。
答案 0 :(得分:5)
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
}
答案 1 :(得分: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
}
答案 2 :(得分:1)
是的,您可以创建一个空切片并使用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