メソッドと構造体
1.メソッド必ずどっちの構造体と紐つけてるので、メソットの名前は同じでもOK
2.ポインター(a *A)使うと定義した構造体中の値を変更するのがOK
例:
array・多重配列
xxx int{
{19:1}
{18:2}}で定義することも可能
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追加
メモリー>容量超えたら、アドレスが変更しちゃう、倍に
1回目追加する時容量6を超えてない、アドレス変更しない
1回目追加する時容量6を超えた、違うアドレスが返してくる。
この場合
s2の容量が超えた、違うアドレスが帰ってくるなので、
s1変更しても、s2が変更しない、s1に指してないから
Copy
s2の長さは3なので、[1,2,3]になる、
逆だと、[7,8,9,3,4,5]場所同じどころに上書き、長さがs1を基準している
Map
探すのが早いけど、読み取るのが遅い、できれば配列、sliceを使う
map[1:OK]
mapの中にmapある場合:
mapの中にmapがあるので、mapを2回初期しないといけない。
初期してるかどうが、okで判断する、trueとfalseしか返してこない
ちょっと難しい例:goでは値を渡す時はコピーなので、slice + map keyで取る、その物自身を編集する!
2.そのままsliceを引数として渡す、slice元々はアドレスタイプ型なので、そのまま値が変えることが可能
結果
[5,6,7,8]
[5,6,7,8]
function
ちょっとよく使う例、外から引数を渡してきてた。
11
12
defer
メソッドが全部実行終わった時実行する!
エラーの時も実行する!
注意:
deferの後ろに ()つけないといけない、メソッドを呼びだし見たい感じー> A()見たい
この例の結果は
3
3
3
closure関数なので、アドレスを使う、最後forを脱ぐdefer使う時、3回のアドレス全部一緒、3なので。