如何在golang中创建一个不固定长度的切片
how to create a unfixed length slice in 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())
}
我想要实现的是一种在java中模拟ArrayList
行为的方法,我可以简单地list.add()
而不关心长度。
GoLang 中的 slice 可以做到吗?
谢谢。
Go slice 不能做到这一点,但是 append()
函数会增加你的 slice,因为追加元素变成了 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
}
是的,您可以创建一个空切片并使用 append
附加到它。如果您或多或少知道您期望的平均大小,您可以为它保留一些 space,就像在 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
要从 FileInfo
的切片中生成名称切片,您不需要像 Java ArrayList
.
这样的东西
ioutil.ReadDir()
returns 你 FileInfo
的一片,你可以使用内置的 len
[=24= 查询它的长度] 函数:
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
}
有什么方法可以在 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())
}
我想要实现的是一种在java中模拟ArrayList
行为的方法,我可以简单地list.add()
而不关心长度。
GoLang 中的 slice 可以做到吗?
谢谢。
Go slice 不能做到这一点,但是 append()
函数会增加你的 slice,因为追加元素变成了 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
}
是的,您可以创建一个空切片并使用 append
附加到它。如果您或多或少知道您期望的平均大小,您可以为它保留一些 space,就像在 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
要从 FileInfo
的切片中生成名称切片,您不需要像 Java ArrayList
.
ioutil.ReadDir()
returns 你 FileInfo
的一片,你可以使用内置的 len
[=24= 查询它的长度] 函数:
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
}