【GO】組み込み関数について(new, make, delete等々)


newmakeを使って変数宣言したりappendを使ってスライスの追加なんかを自然とやってきたけど、ふとこれは何だっけと思って調べてみました。

するとビルトインパッケージとして参照することができた。

ソースを見た感じgodoc用に見えるので中身は説明を読んで使ってみる必要がある。

この辺は知らないと使えないものなのでおさらいしておきます。

標準出力

  • func print(args …Type)
  • func println(args …Type)

fmt.Printfmt.Printlnと似たような動きちょっとした出力用途で使える。

ただ自動で型推定なんかはしてくれないので結局fmtを使うことになると思う。

メモリ(容量)管理系

  • func new(Type) *Type
  • func make(t Type, size …IntegerType) Type

混同しやすいけどnewはゼロ値で確保された値へのポインタを得る関数で、makeはマップ、スライス、チャンネル(map[type]type, []type, chan)の確保と初期化を行い型そのものを得る関数です。

この3つは型そのものがポインタを持っているのでmakeで型を得ています。

それ以外のstruct定義したものなんかは容量を気にして渡しやすいポインタをnewで得る思っておけばとりあえず間違いはないはず。

 

試しにスライスでこんなことをする。

newで確保した場合のサイズは8(つまりポインタだけ)ですね。

スライスはpointer, len(int), cap(int)の24バイトとなるのが正しい動作です。

まあnewで作ってもこんな風に使っていけなくもないですが。

 

  • func append(slice []Type, elems …Type) []Type
  • func copy(dst, src []Type) int

スライスの追加とコピーの関数です。

appendは確保した容量に追加する形の非破壊的な関数です。

copyはいわゆるディープコピー。スライスは型ですが中身のポインタが代入されるため参照渡しのようになってしまいます。

そこでcopyですが、する側の容量がされる側の容量より大きくないとindex out of rangeエラーになります。

また大きい部分に関しては無視されます。

ちなみにスライスに削除はないので使わない方法を探すか実装の必要があります。

 

  • func delete(m map[Type]Type1, key Type)

マップの削除に使います。

スライスで削除できないこともあって、個人的には順不同ならmapを使うことが多いです(rangeではmapの順序は保証されない)。

 

  • func cap(v Type) int
  • func len(v Type) int

capはメモリ確保した長さでlenは汎用的な長さを返す関数です。

この例のスライスはappendによるメモリ再確保で11までの領域が使用可能になり、元の10の倍の20分のメモリが確保されています。

型ごとに動作が違うので詳しくは原文参照。

説明抜き出し
cap

Array: the number of elements in v (same as len(v)).
Pointer to array: the number of elements in *v (same as len(v)).
Slice: the maximum length the slice can reach when resliced;
if v is nil, cap(v) is zero.
Channel: the channel buffer capacity, in units of elements;
if v is nil, cap(v) is zero.

len

Array: the number of elements in v.
Pointer to array: the number of elements in *v (even if v is nil).
Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
String: the number of bytes in v.
Channel: the number of elements queued (unread) in the channel buffer;
if v is nil, len(v) is zero.

 

  • func close(c chan<- Type)

チャンネル終了用。

make(chan Type)したものはちゃんとcloseさせましょう。

例外

  • func panic(v interface{})
  • func recover() interface{}

ルーチンを止めたり、復帰させたりする。

通常用途ではあまり使うべきものでもない。

複素数

  • func complex(r, i FloatType) ComplexType
  • func real(c ComplexType) FloatType
  • func imag(c ComplexType) FloatType

これも普段使う機会はないけど複素数作成用と実数、虚数の取得用。


コメントを残す

メールアドレスが公開されることはありません。