2012-05-24 14 views
9

Napisałem poniższy kod. Ale nie mogę tego skompilować. Tu jest mój kodu:Problemy dotyczące "plasterka" i "dołącz" w Go

package main 

import "fmt" 

func main() { 
    tmp := make([]int, 10) 
    for i := 0; i < 10; i++ { 
     tmp[i] = i 
    } 
    res := mapx(foo, tmp) 
    fmt.Printf("%v\n", res) 
} 

func foo(a int) int { 
    return a + 10 
} 

func mapx(functionx func(int) int, list []int) (res []int) { 
    res = make([]int, 10) 
    for _, i := range(list) { 
     append(res, functionx(i)) 
    } 
    return 
} 

Tymczasem komunikat o błędzie jest również bardzo mylące: prog.go:21: append(res, functionx(i)) not used

Ale jeśli mogę wymienić append(res, functionx(i)) (linia 21) z res = append(res, functionx(i)), działa całkiem dobrze. Czy ktoś może mi pomóc?

Dziękujemy!

Odpowiedz

30

Appending to and copying slices

Funkcja zmiennej liczbie argumentów do dołączania dodaje zero lub więcej wartości X do S typu S, która musi być typu plaster i zwraca wynikowy plastra również szczepu S.

Jeśli pojemność s nie jest wystarczająco duża, aby zmieścić dodatkowe wartości, przydział append przydziela nowy, wystarczająco duży kawałek, który pasuje zarówno do istniejących elementów plasterka, jak i dodatkowych wartości. Zatem zwrócony plaster może odnosić się do innej macierzy bazowej.

Calls

W wywołaniu funkcji, wartość funkcji i argumenty są oceniane w zwykły zamówienia. Po ich ocenie parametry wywołania są przekazywane wartości do funkcji, a wywoływana funkcja zaczyna się od wykonania . Parametry zwracane funkcji są przekazywane z powrotem do wywołującej funkcji o wartości , gdy funkcja zwraca.

W Go argumenty są przekazywane według wartości.

Musisz napisać res = append(res, functionx(i)), aby nie odrzucać nowej wartości res, która odnosi się do innego plasterka i ewentualnie innej bazowej tablicy.

Na przykład

package main 

import "fmt" 

func main() { 
    res := []int{0, 1} 
    fmt.Println(res) 
    _ = append(res, 2) // discard 
    fmt.Println(res) 
    res = append(res, 2) // keep 
    fmt.Println(res) 
} 

wyjściowa:

[0 1] 
[0 1] 
[0 1 2] 
Powiązane problemy