bam6o0の記憶域

忘備録になればいいな

Go言語の勉強記録9bit

ポインタ

  • 変数が存在するメモリ上の場所をアドレスという。
  • そのアドレスを格納可能な変数をポインタをいう。
  • int型変数のアドレスを格納できるポインタの型は*intと記述し型の前に*を付ける。
  • 変数からアドレスを取得する時は&(アドレス演算子)を使う。
  • アドレスか指し示す変数にアクセスするときは*を使う。

実行結果

$go run pointer.go
iのアドレス 0xc42006e178
ptrの値(変数iのアドレス: 0xc42006e178
iの値: 12345
ポインタ経由のiの値 12345
ポインタ経由で変更したiの値: 999

ポインタ渡しと値渡し

  • ある変数を関数に渡すと、実際の値はコピーされる。
  • コピーされた値を関数内で変更しても関数の呼び出し元の値には影響がない。
  • 値のポインタを関数に渡した時は、値の実態は関数の呼び出し元と同じ。
  • ポインタを渡した場合は関数内で呼び出し元の値を変更できる。
  • ポインタをつかって値を受け渡すことをポインタ渡しという。
  • 値のコピーを受け渡すことを値渡しという。
  • GoではCとは違い、ポインタの値を演算できない。

実行結果

$go run pointer_value.go
値渡し: 1
ポインタ渡し: 2

new組込み関数によるメモリの割り当て

  • アドレスは変数を間接参照したときだけではなく、明示的に新しいメモリを割り当てることでも得られる。
  • メモリを割り当てるにはnew組込み関数を使用する。
  • メモリを割り当てたい型を指定する。
  • new組み込み関数を死闘して割り当てられたメモリはゼロ値で初期化される。
  • 割り当てたメモリが使わなくなったと判断されると自動的に解放される。
  • 書式
new 型
  • 使用例
var i *int new(int)

var s *string = new(string)

ゼロ値

  • 変数を明示的に初期化しなかった時に暗黙的に設定される初期値
  • 変数の型によってゼロ値はことなる。
  • 論理値型 false
  • 数値型 0
  • 文字列型 ""
  • 配列型 各要素がゼロ値の配列
  • 構造体型 各フィールドがゼロ値の構造体
  • その他 nil

nil

  • nilとは値がない状態
  • CでのNULL
  • Javaでのnull
  • nilは比較演算子で比較できる。
if s == nil{
  fmt.Pritnln("nilです")
}

if s != nil{
  fmt.Println("nilではない")
}