2017-03-07 12 views
0

personのスライスはfriendshipです。オブジェクトへのポインタとしてfriendshipを初期化しようとしましたが、何らかの理由で失敗し、その結果、誰もfriendshipを持っていません。私はどこのどこかでポインタを使用していませんか?Go内の構造体内の構造体スライスを変更する

package main 

import (
    "fmt" 
    "math/rand" 
) 

type friendship struct { 
    friend *person 
} 

type person struct { 
    name  int 
    friendship []friendship 
} 

func createPerson(id int) person { 
    return person{id, make([]friendship, 0)} 
} 

func (p *person) addFriends(possibleFriends []*person, numFriends int) { 
    var friend *person 
    for i := 0; i < numFriends; i++ { 
     friend = possibleFriends[rand.Intn(len(possibleFriends))] 
     p.friendship = append(p.friendship, friendship{friend}) 
    } 
} 

func main() { 
    numPeople := 20 
    people := make([]person, numPeople) 
    possibleFriends := make([]*person, numPeople) 
    for i := 0; i < numPeople; i++ { 
     people[i] = createPerson(i) 
     possibleFriends[i] = &(people[i]) 
    } 
    for _, p := range people { 
     p.addFriends(possibleFriends, 2) 
    } 
    fmt.Println(people) 
} 
+0

http://stackoverflow.com/questions/15945030/change-values-while-iterating-in-golang – Fallen

答えて

2

使用

for i := 0; i < numPeople; i++ { 
     people[i].addFriends(possibleFriends, 2) 
} 

または

for i, _ := range people { 
     people[i].addFriends(possibleFriends, 2) 
} 

代わりのppeople[i]のコピーであるためである

for _, p := range people { 
     p.addFriends(possibleFriends, 2) 
} 

addFriendsにはEFFがありません電気ショック療法スライスpeople

+0

上いっそ、私たちは私のために ' を行うことができます=範囲の人々{ 人[I ] .addFriends(可能な友達、2) } ' – mgoldwasser

関連する問題