背景
- Go言語のプロジェクトでよく*(ポインタ)を見かける。
例1
func setName(user *User,name string){
user.username = name
}
例2
type (
Users []*User
)
- ではなぜそうなるでしょうか?
結論
(ポインタ)を使わないと構造体(struct)の値が編集できない **
例1 *(ポインタ)を使わず、structを編集する
type User struct {
username string
password string
}
type (
Users []User
)
func setName(user User,name string){
user.username = name
}
func (user User) setName(name string){
user.username = name
}
func main(){
changeTheValue()
}
func changeTheValue(){
user := User{
username:"syoui",
password:"pass",
}
log.Printf("before change the value of the user %s",user.username)
user.username = "villa"
log.Printf("after changing the value of the user %s",user.username)
setName(user,"kelr")
log.Printf("after changing the value of the user %s",user.username)
user.setName("syoui")
log.Printf("after changing the value of the user %s",user.username)
}
before changing the value of the user syoui
after changing the value of the user villa
after changing the value of the user villa
after changing the value of the user villa
結果
- user.username = "villa" -> 編集できた
- setName(user,"kelr") -> 編集できませんでした
- user.setName("syoui") -> 編集できませんでした
例2 *(ポインタ)を使う、structを編集する
type User struct {
username string
password string
}
type (
Users []User
)
func setNameUserByPoint(user *User,name string){
user.username = name
}
func (user *User) setNameByPoint(name string){
user.username = name
}
func main(){
changeTheValue2()
}
func changeTheValue2(){
user := &User{
username:"syoui",
password:"pass",
}
log.Printf("before change the value of the user %s",user.username)
user.username = "villa"
log.Printf("after change the value of the user %s",user.username)
setNameUserByPoint(user,"kelr")
log.Printf("Adter change the value of the user %s",user.username)
user.setNameByPoint("syoui")
log.Printf("Adter change the value of the user %s",user.username)
}
before change the value of the user syoui
after change the value of the user villa
Adter change the value of the user kelr
Adter change the value of the user syoui
結果
- user.username = "villa" -> 編集できた
- setName(user,"kelr") -> 編集できた
- user.setName("syoui") -> 編集できた