Pointers 在Go中的结构中修改结构切片

Pointers 在Go中的结构中修改结构切片,pointers,go,struct,slice,Pointers,Go,Struct,Slice,在下面的示例中,一个人有一个友谊s片段,我尝试将一个友谊初始化为指向另一个人对象的指针,但由于某种原因它失败了,结果是没有人有任何友谊s。我不是在应该在的地方使用指针吗 package main import ( "fmt" "math/rand" ) type friendship struct { friend *person } type person struct { name int friendship []friendshi

在下面的示例中,一个
有一个
友谊
s片段,我尝试将一个
友谊
初始化为指向另一个
对象的指针,但由于某种原因它失败了,结果是没有人有任何
友谊
s。我不是在应该在的地方使用指针吗

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)
}
主程序包
进口(
“fmt”
“数学/兰德”
)
类型友谊结构{
朋友
}
类型person结构{
名称int
友谊
}
func createPerson(id int)person{
返回人{id,make([]友谊,0)}
}
func(p*person)addFriends(可能的friends[]*person,numFriends int){
我的朋友是谁
对于i:=0;i
使用

而不是

 for _, p := range people {
        p.addFriends(possibleFriends, 2)
 }
这是因为
p
people[i]
的副本,
addFriends
对slice
people
的使用没有影响

而不是

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

这是因为
p
people[i]
的一个副本,
addFriends
对slice
people

没有任何影响,我们可以为i:=range people{people[i]做
。addFriends(可能的朋友,2)}
更好的是,我们可以为i:=range people{people[i].addFriends做
(可能的friends,2)}
 for _, p := range people {
        p.addFriends(possibleFriends, 2)
 }