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

时间:2015-01-06 06:20:18

标签: go slice

有没有办法在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切片吗?

感谢。

3 个答案:

答案 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