2016-04-26 12 views
-1

以下のコードでは、なぜ両方ともfmt.Println(len(people))印刷0ですか? ここで指摘したように、https://stackoverflow.com/a/2441112/315445など、スライスは参照型です。発信者(メイン)が更新されたデータを見ないのはなぜですか?発信者が新しいデータをスライスで見ないのはなぜですか?

package main 

import "fmt" 

type Person struct { 
    name string 
    age string 
} 

func main() { 
    var people = make([]Person, 0) 
    fmt.Println(len(people)) 
    getList(people) 
    fmt.Println(len(people)) 
} 

func getList(people []Person) { 
    people = append(people, Person {"Foo", "1"}) 
    people = append(people, Person {"Bar", "2"}) 
} 

しかし、これは機能します。だから実際にはないpass-by-reference

package main 

import "fmt" 

type Person struct { 
    name string 
    age string 
} 

func main() { 
    var people = make([]Person, 0) 
    fmt.Println(len(people)) 
    people = getList(people) 
    fmt.Println(len(people)) 
} 

func getList(people []Person) []Person { 
    people = append(people, Person {"Foo", "1"}) 
    people = append(people, Person {"Bar", "2"}) 
    return people 
} 

答えて

2

スライスには、バッキングアレイへのポインタ、長さと容量が含まれています。 append組み込み関数は、新しい長さを持つ新しいスライスを返します。また、再配置されたバッキング配列への新しいポインタを返します。

スライスは値渡しされます。 getListのスライスに対する変更は、呼び出し元では表示されません。バッキングアレイへの変更は、呼び出し側に表示されます。

スライスは、バッキングアレイへのポインタを含むため、リファレンスタイプと呼ばれます。

関連する問題