2016-05-07 11 views
2

golangで遊んでいて、userGroup構造体内でユーザーの電子メールを変更できない理由を理解できません。構造体の値を変更する

package main 

import "fmt" 

type user struct { 
    name, email string 
} 

func (u *user) changeEmail(newEmail string) { 
    u.email = newEmail 
} 

type userGroup struct { 
    users map[int]user 
} 

func (ug *userGroup) mapOverUsers(fn func(u *user)) { 
    usersLen := len(ug.users) 
    for i := 0; i < usersLen; i++ { 
     usr := ug.users[i] 
     fn(&usr) 
    } 
} 

func main() { 
    ug := userGroup{ 
     map[int]user{0: {"0", "ZZZ"}, 1: {"1", "ZZZ"}, 2: {"2", "ZZZ"}}} 

    fmt.Println(ug) 

    // should be same as (&ug).mapOverUsers 
    ug.mapOverUsers(func(u *user) { 
     u.changeEmail("XXX") 
     fmt.Println(u) 
    }) 

    fmt.Println(ug) 
} 

私がチェックし、私はug(userGroupの)とu(ユーザー)のためにメモリ内の同じアドレスを参照すると信じています。たぶん、それは正しいアプローチではない、ちょうど本を読んで、私が行くように単純なことをしようとしている。ありがとうございました。

答えて

5

ライン

usr := ug.users[i] 

マップ内のユーザーのコピーを作成します。このコピーは変更されています。これを修正するには2つの方法があります。

usr := ug.users[i] 
    fn(&usr) 
    ug.users[i] = usr 

playground example

:第二バック変更後マップ値を格納することである

type userGroup struct { 
    users map[int]*user 
} 

playground example

:最初は、マップ内のユーザへのポインタを格納しています

関連する問題