如何在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
}