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

## メソッドと構造体

1.メソッド必ずどっちの構造体と紐つけてるので、メソットの名前は同じでもOK
2.ポインター(a *A)使うと定義した構造体中の値を変更するのがOK
例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/afef1e65-2035-cf9d-8946-4d6fef945eb1.png)


GOの特徴：
例：int型に別のしたいことを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/af296d4f-6d4e-5f7d-19d2-c59065b298e6.png)

##array・多重配列
xxx int{
{19:1}
{18:2}}で定義することも可能
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/a0eeed77-f0ef-0a52-dbd7-9b56067eef35.png)

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

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


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

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

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


##Append関数、slice追加
メモリー＞容量超えたら、アドレスが変更しちゃう、倍に
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/419f62d9-e307-0b2a-a20f-2f9d7df8cb83.png)
1回目追加する時容量６を超えてない、アドレス変更しない
1回目追加する時容量６を超えた、違うアドレスが返してくる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/45847fdc-9c8d-28f0-3007-4697553979f5.png)
この場合
s2の容量が超えた、違うアドレスが帰ってくるなので、
s1変更しても、s2が変更しない、s1に指してないから
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/6dd06460-b6c8-afc6-de42-70957025e522.png)

##Copy
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/2f42d8eb-67e7-b28b-ae1c-520a01e9c44a.png)

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

##Map
探すのが早いけど、読み取るのが遅い、できれば配列、sliceを使う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/6436881d-c964-7f16-f325-4aa699498ad1.png)

map[1:OK]

mapの中にmapある場合：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/1dc0cb5a-aa10-17dc-f0c5-47251aff8745.png)
mapの中にmapがあるので、mapを2回初期しないといけない。

初期してるかどうが、okで判断する、trueとfalseしか返してこない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/603c95b8-bc72-6ab8-cbfa-b7625e229f7b.png)

ちょっと難しい例：goでは値を渡す時はコピーなので、slice + map keyで取る、その物自身を編集する！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/3ee1fd40-b1a9-e431-f2f5-e1ff00460b2a.png)

map(k無順番なので、順番毎回変わる)を順番にしたい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/5eedfa55-de53-659d-0685-97563bed62b9.png)

map key と value交換する例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/e346c504-3f81-ae1b-e85c-080df8685a50.png)


普通の値だとコピーなので、
1.ポインターを使うか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/3d8c2094-5b67-d668-eb8a-a3eed6dc7e36.png)

2.そのままsliceを引数として渡す、slice元々はアドレスタイプ型なので、そのまま値が変えることが可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/ae2ebbaa-584c-3af2-ce49-0c323951027c.png)
結果
[5,6,7,8]
[5,6,7,8]

## function
不思議！これでもOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/180474b4-614b-f908-3720-819d0df6604b.png)

closure 関数
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/854fedf2-9f8e-5e44-6cfc-0a11f785c93f.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/e1f4c357-4071-2b2c-aecc-eb0c58bb3dc1.png)

11
12

## defer
メソッドが全部実行終わった時実行する！
エラーの時も実行する！
注意：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/7093827a-fbfa-c4c3-805c-2c84141d1fee.png)
deferの後ろに ()つけないといけない、メソッドを呼びだし見たい感じー＞ A()見たい
この例の結果は
3
3
3
closure関数なので、アドレスを使う、最後forを脱ぐdefer使う時、３回のアドレス全部一緒、３なので。


##panicとrecover
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190518/8ee4cad3-d8ec-bcc2-7f3d-b8917953e85a.png)