LoginSignup
1
0

More than 5 years have passed since last update.

Golangのメソッドと構造体、ポインター

Last updated at Posted at 2017-11-01

メソッドと構造体

1.メソッド必ずどっちの構造体と紐つけてるので、メソットの名前は同じでもOK
2.ポインター(a *A)使うと定義した構造体中の値を変更するのがOK
例:
image.png

GOの特徴:
例:int型に別のしたいことを追加
image.png

array・多重配列

xxx int{
{19:1}
{18:2}}で定義することも可能

image.png

slice

.len()

.cap()
make()で定義
new() -> ポインターになるので、sliceもともとポインターとなってるようなものなので、
new()だったら、ポインターのポインターになる。

var si []int ->slice
var si [...]int  ->配列
var si [10]int ->配列

si = a[5:] //5番目から最後まで
a:= [10]int{}
si := a[9] //9番->0
si := a[5:10] //5-9 5番ー9番目までのもの全部洗い出す。

定義: si = make([]int,1,10)
//int型、長さ1、容量10、10超えたら、メモリ再分配、倍に(効率悪くなる)

Reslice (1,2,3,4,5,6,7,8,9)

始め0番目はされたsliceを基準に、slice長さは3 (5,6,7)であるかもしれないが、メモリ上では容量(5,6,7,8,9)まで取る、ただし表示しない。

Append関数、slice追加

メモリー>容量超えたら、アドレスが変更しちゃう、倍に
image.png
1回目追加する時容量6を超えてない、アドレス変更しない
1回目追加する時容量6を超えた、違うアドレスが返してくる。

image.png
この場合
s2の容量が超えた、違うアドレスが帰ってくるなので、
s1変更しても、s2が変更しない、s1に指してないから
image.png

Copy

image.png

s2の長さは3なので、[1,2,3]になる、
逆だと、[7,8,9,3,4,5]場所同じどころに上書き、長さがs1を基準している

Map

探すのが早いけど、読み取るのが遅い、できれば配列、sliceを使う
image.png

map[1:OK]

mapの中にmapある場合:
image.png
mapの中にmapがあるので、mapを2回初期しないといけない。

初期してるかどうが、okで判断する、trueとfalseしか返してこない
image.png

ちょっと難しい例:goでは値を渡す時はコピーなので、slice + map keyで取る、その物自身を編集する!
image.png

map(k無順番なので、順番毎回変わる)を順番にしたい
image.png

map key と value交換する例:
image.png

普通の値だとコピーなので、
1.ポインターを使うか
image.png

2.そのままsliceを引数として渡す、slice元々はアドレスタイプ型なので、そのまま値が変えることが可能
image.png
結果
[5,6,7,8]
[5,6,7,8]

function

不思議!これでもOK
image.png

closure 関数
image.png

ちょっとよく使う例、外から引数を渡してきてた。

image.png

11
12

defer

メソッドが全部実行終わった時実行する!
エラーの時も実行する!
注意:
image.png
deferの後ろに ()つけないといけない、メソッドを呼びだし見たい感じー> A()見たい
この例の結果は
3
3
3
closure関数なので、アドレスを使う、最後forを脱ぐdefer使う時、3回のアドレス全部一緒、3なので。

panicとrecover

image.png

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