はじめに
備忘録です。
JSで開発している人がGolangを触ると &
や *
で何だこれとなると思います。
なので、何をしているかJSに置き換えてみました。
個人解釈なので、認識違いがあるかと...
Goにおける &
「参照渡し」を明示的に行うためにつける。(Goは基本「値渡し」のため)
func main() {
name := "名前"
p = &name // 明示的に参照渡しする 別アドレスにnameのアドレスに紐付かせるイメージ
name2 = name // 値渡し 別アドレスに別の値として格納
p = "ポインタ君"
name2 = "値渡し君"
fmt.Println(name, p, name2)
// ポインタ君, ポインタ君, 値渡し君
}
const a = { p: 'ap' };
const b = obj; // 参照渡し
const c = { ...obj }; // New Object で違うメモリ使う
b.p = 'bp';
c.p = 'cp';
console.log(a, b, c);
// { p: 'bp' }, { p: 'bp' }, { p: 'cp' }
Goにおける *
TSの型みたいなもの
ポインタ型ですよって言っているイメージ。
type PointName struct {
FirstName: *string,
LastName: string,
}
func main() {
firstName := "名"
name:= &PointName{
// FirstName: firstName, これだとエラーになる -> ポインタ型じゃないから
FirstName: &firstName,
LastName: "姓",
}
fmt.Println(*name.FirstName) // ポインタ使用している値は * をつけると参照先の値が出力できる
fmt.Println(name.FirstName) // これだと firstName のアドレスが表示される
}
参考記事