2015-03-05 22 views
36

Wydaje się, że byłoby to dość powszechne i obfite przykłady we wszystkich interwebsach, ale nie mogę znaleźć przykładu konwersji [32]byte na []byte.Konwertuj tablicę na plaster w Go

Mam funkcję, że połączenie z zewnętrzną lib zwracającej tablicą

func Foo() [32]byte {...} 

Następnie należy przekazać ten wynik do innej funkcji do dalszego przetwarzania.

func Bar(b []byte) { ... } 

Unforunately, gdy próbuję zadzwonić

d := Foo() 
Bar(d) 

uzyskać

cannot convert d (type [32]byte) to type []byte 

Doing

[]byte(d) 

nie jest dużo lepiej. Jak to zrobić, zwłaszcza bez tworzenia kopii danych (wydaje się głupio skopiować te dane, gdy wszystko, co robię, przekazuje je dalej).

+4

Apostolskiej https://blog.golang.org/slices –

Odpowiedz

51

To powinno działać:

func Foo() [32]byte { 
    return [32]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} 
} 

func Bar(b []byte) { 
    fmt.Println(string(b)) 
} 

func main() { 
    x := Foo() 
    Bar(x[:]) 
} 

I to nie tworzy kopię bazowego buforze

+1

jest możliwe, aby uzyskać oneliner, np. 'Bar (Foo() [:])' działa? –

3

Będzie to zrobić lewy:

slice := array[0:len(array)] 

także zapobiega kopiowaniu bufor podstawowy .

+4

Wartość domyślna dla dolnej granicy wynosi 0. Domyślną górną granicą jest 'len (x)', więc 'x [0: len (x)]' jest lepiej napisane jako 'x [:]'. Dokładnie to, co mówi obecna odpowiedź. –

+9

Uważam, że liczba spadków jest nieco trudna, biorąc pod uwagę ważność rozwiązania ... –

+0

Mimo że PO chciał tylko pełnej konwersji podstawowej tablicy, warto wiedzieć, że określenie dolnej granicy i górnej granicy jest identyczne z adnotacją przekroju. Na przykład możesz chcieć przydzielić tablicę (zamiast użyć make slice), a następnie ustawić części tablicy za pomocą dolnej granicy wiążącej/górnej notacji. Przykład: https://play.golang.org/p/BwIvavioBj –

21
arr[:] // arr is an array; arr[:] is the slice of all elements 
0

Generalnie można pokroić tablicę według swoich granicach z ::

var a [32]byte 
slice := a[:] 

Bardziej ogólnie, w następującym szeregu:

var my_array [LENGTH]TYPE 

można wytworzyć segment różnych rozmiarach przez pisanie:

my_array[START_SLICE:END_SLICE] 

Pominięcie START_SLICE jeśli to równa się nisko związany i END_SLICE jeśli równa wysoka granica, w przypadku:

a[0:32] 

produkuje kawałek bazowego tablicy i odpowiada:

a[0:] 
a[:32] 
a[:]