2015-01-06 1 views
0

Есть ли способ создать незафиксированная длина ломтик в go? В качестве примера, я хочу захватить все имена файлов в каталоге (content/), заполнить до [] string фрагмент.Как создать отрезанный отрезок длины в golang

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()) 
} 

То, что я хочу достичь, это способ имитировать поведение ArrayList в Java, который я могу просто list.add() и не заботятся о длине.

Может ли разрезать GoLang сделать это?

Спасибо.

ответ

5

A 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 
} 
+0

Спасибо, я изо всех сил через [официальный блог] (http://blog.golang.org/go-slices-usage-and-internals) снова и иметь лучшее представление о срезе GoLang в механизм. – armnotstrong

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 
+1

Спасибо, это забронированное предложение действительно заставляет меня искру. – armnotstrong

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 
} 
+1

Upvote для обеспечения правильного решения для этого случая. – fuz