LoginSignup
1
0

More than 3 years have passed since last update.

Go言語*(ポインタ)を使う必要性の簡単な例

Posted at

背景

  • 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") -> 編集できた
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0