GoLang

10分GO 18日目 - 構造体とかユーザー定義型とか(疑問残り中)

ペースが落ちていますが、今週はWomen Who GO さん主催のGOのお勉強会に行ってきました。

 

GOメモ

講師は@tenntennさん。

基本の基本なお勉強でしたが、変数にしても関数にしてもひとつひとつ深く解説してくれるので、知ってることだけどさらに知識のブラッシュアップができたというか、改めていいお勉強させてもらったのでした。

tenntennさん、わからない人がいたら講義ストップしてちゃんとわかるまで教えてくれる・・ここ後回しにちゃったら後で大変だから〜と。教える姿勢も素晴らしい。アウトプットもなんでもいいからしなさいよと・・。

文法

ほんとにメモ。↓書いたこと以外もいっぱいやったんだけど、資料もあるので印象に残ってるのだけ書いてます。

switch
  • break文は不要。自動でbreakしてくれる。
  • breakせずに次に続けたい場合は、fallthroughを記述する

 

for
func main() {
	var i int
	for {
		switch {
		case i%2 == 1:
			break
		}
		i++
	}
}

これだと、for文を抜けることができない。switch抜けるだけ。

ラベルを使う。

func main() {
	var i int
LOOP:
	for {
		switch {
		case i%2 == 1:
			break LOOP
		}
		i++
	}
}

VBとかのラベル(GOTO文)って飛びたい先にラベル貼るけど、GOの場合はラベルでスコープ決めて、breakでラベルの範囲から抜けるらしい。

 

変数

変数のスコープ
  • スコープが小さいと保守がしやすい

 

コンポジット型
  • 何かしらのデータが集まった型

 

構造体とmapの違い
  • 構造体はあらかじめ、マップに対するキーが決まっている
  • マップはなんでもOK

ちょっと意味わからん?マップに対するキーとは??次回聞いてみよう。

 

ゼロ値
  • 構造体:フィールドが全てゼロ値
  • 配列:要素が全てゼロ
  • スライス:nil
  • マップ:nil

構造体の中にmap場合はnilになるのか???

 

構造体の宣言

var n struct{} ←とじカッコまで全て型(そんなこと考えたこともなかった)

var p struct←構造体ですよ宣言 {
    フィールド名 型
    フィールド名 型
}

 

リテラル

識別子(名前)が付与されていないもの

 

型リテラル
  • 型の具体的な定義を書き下した型の表現方法
  • コンポジット型などを表現するために使う
  • 変数定義やユーザー定義型などで使用する
構造体

フィールドの型は組み込み型以外(コンポジット型でもユーザー定義型)でもOK。

var p struct {  ←structからとじカッコまで型リテラル
    name string
    age int
}

 

構造体初期化
p := struct {
    name string
    age int
}{
    name: "Gopher",
    age: 10,
}

 

 

ユーザー定義型

超重要!ってことでかなり時間を割いて丁寧に教わりました(嬉しい)。

自分もCやり始めのこと、typedefが全く理解できなくて躓いた覚えがある。そして後々辛い。

// 組み込み型
type MyInt int

// 他のパッケージの型
type MyWriter io.Writer

// 型リテラルを基にする structからとじカッコまで型
type Person struct {
    Name string
}

↓構造体をよくこうやって書いたいるする

p := Person { Name:”hoge”}
-----
var p Person

このパターンしか知らない人は、structが出てきた時に混乱する。

 

関数

tenntennさん「関数ってなんですか?説明できます?」

急に振られる・・

私「何か投げると、いい感じにしたものが返ってくる感じ」(←酷い)

tenntennさん「xを入れたらyが出るみたいなのは、数学的関数ですね」

プログラム的なの関数とは

  • 処理のまとまり
  • 極端に言えば入出力はなくてもいい

なるほど、そうですね。引数なしとか、戻りがないものもある・・。

 

組み込み型関数
  • 言語の機能として組み込まれている関数
  • あたまに 「パッケージ名.」 が付かないもの。

 

関数に戻り値を使いたくない場合はブランク変数を使う

なんでかって、使わないのに変数書いて受け取っちゃうと「この変数使ってないんだけど」ってコンパイラに怒られるから。

パニックでどうのこうのとか言ってたかな・・・(名前付き戻り値でいってたかな・・忘れた)

 

名前付き戻り値

戻り値の変数に名前をつける

func swap(x, y int) (x2, y2 int) {
	y2, x2 = x, y
	return
}

なんでいちいち名前をつけるのか?

例えば、intが二つ並んでる場合、変数名があると、なんの値か推測しやすい。緯度経度なのか、日付なのかとか

ドキュメントの役割を兼ね揃えている

なるほど!

 

その他

Goって

m, n = n, m

って書けるだって。

 

-GoLang