亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在golang中創建一個不固定長度的切片

如何在golang中創建一個不固定長度的切片

Go
喵喔喔 2021-09-10 17:19:57
有沒有辦法在 go 中創建一個不固定長度的切片?例如,我想獲取目錄中的所有文件名(content/)填充到一個[] string切片中。該content/目錄包含:$-> tree content/content/├── 1.txt├── 2.txt└── tmp這是我目前得到的:package mainimport (    "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 可以做到這一點嗎?
查看完整描述

3 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

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

}


查看完整回答
反對 回復 2021-09-10
?
臨摹微笑

TA貢獻1982條經驗 獲得超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

}


查看完整回答
反對 回復 2021-09-10
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

是的,您可以創建一個空切片并使用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


查看完整回答
反對 回復 2021-09-10
  • 3 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號