あなたの主な問題は、あなたの質問に現れる2つの概念のどちらもうまく理解していないということです。
ポインタで開始しましょう。ポインタを使用しない場合、値の割り当てとは、以前の値の単純なコピーを作成することを意味します。新しい価値は、以前のものと縛られていません。つまり、古い値または新しい値を変更すると、それは2番目の値に影響しません。これは、プリミティブ型(int、bool、stringなど)と構造体の場合は正常です。
a := 1
b := a
a++ // a was changed, but value of b does not change at all
ここでポインタは、メモリにいくらかのスペースを指し示すものです。簡単にするために、2つのポインタを作成し、両方とも同じ場所を指します。
package main
import (
"fmt"
)
func main() {
type student struct {
name string
age int
}
p1 := &student{"hongseok", 13} // this mean create a new student, but we want only address of student, not value
p2 := p1
(*p1).age = 15 // because p1 and p2 point to same memory (*p2).age also changed
fmt.Println("1.", p2.age) // 15
p2.age = 32 // in golang I could write (*p2).ago or p2.ago this is the same
fmt.Println("2.", p1.age) // 32
fmt.Println("3.",p1, "==", p2)
fmt.Printf("4. %p == %p\n", p1, p2)
// But now I force point p2 to new place
p2 = &student{"another student", 12}
fmt.Println("5.", p1, "!=", p2)
fmt.Printf("6. %p == %p\n", p1, p2)
p1.age = 14 // does it influce p2.age? no! Why? Because it is in different address
fmt.Println("7.", p1, "!=", p2)
// but could is somehow force that point to same address ? Of course
p2 = p1 // p2 will point to same place as p1 and old value of p2 will be freed by garbage collector
}
そして、混乱しないでください。ポインタはvalueという名前のポイントを持つこともできます。
a := 42 // means allocate memory for integer, and we give that memory name "a"
p := &a
*p++ // it change value of a
a = 5 // and of course this change value of *p
そして、メソッドに戻ると、そのレシーバは/ポインタではありません。メソッドのレシーバーがポインタの場合、それは値を変更することができることを意味します - 私は数行前と同じ方法です。
メソッドレシーバーがポインタでない場合は、メソッドを呼び出す前に、メソッドのレシーバーが作成され、そのコピーに対してstructとメソッドのコピーが呼び出されることを意味します。もちろん、コピーの価値を変えることはできますが、元の価値には影響しません。