PREMIUM

Go言語入門 データ型編

Go言語におけるデータ型の使い方について見ていきます。
0%

このレッスンをはじめる前に

このレッスンを進めるには前提知識が必要です。先に以下のレッスンを完了しておきましょう。

    • 今回扱うトピック、カスタム型、メソッド、構造体の合成、インターフェース
    • カスタム型、同じstring型でも、違う型として定義できる
    • type nameString string、string型をベースにnameStringというデータ型を定義
    • カスタム型は変数、関数で型として使える
    • 関数の引数でカスタム型指定すると、その型の値だけを受け付ける
    • メソッド、特定のデータ型専用で定義した関数のこと
    • メソッドは、typeを使ったカスタム型、構造体などのデータ型に設定できる
    • レシーバー、メソッド定義時に書いた部分、(n nameString)
    • 定義、func (n nameString) showProductInfo() {}
    • 関数を呼び出した値、nを関数内で使える
    • 実行、productName.showInfo()、データ型の値に.をつけて、呼び出す
    • メソッドを追加
    • func (n nameString) update(newName string) {}
    • 型が違うと代入ができない
    • 引数で受け取った値を特定の型に変換する、nameString(newName)
    • メソッドで渡されるレシーバー(n)は値のコピーが渡される
    • 関数の中でnを更新しても変化なし、そのため更新後の値を返して再代入
    • 前回の処理をポインタで書き換える
    • func (n *nameString) update(newName string) {*n = nameString(newName)}
    • レシーバーの値を書き換えない時、値レシーバー、値のコピーを渡す、
    • レシーバーの値を書き換える時、ポインタレシーバー、値のポインタを渡す
    • 構造体にメソッドを追加する
    • 構造体、type scoreType struct {}
    • 合否を判定するメソッド、func (s scoreType) isPassed() bool {}
    • 結果の表示、fmt.Println(englishScore.isPassed())
    • 構造体の合成、scoreTypeのフィールドやメソッドは別の構造体でも使える
    • type studentType struct {score scoreType}
    • taro := studentType{}、変数を定義、カンマのつけ忘れに注意
    • 値の表示、fmt.Println(taro.score.points)
    • メソッド実行結果の表示、fmt.Printlm(taro.score.isPassed())
    • 埋め込みフィールド、名前を省いて埋め込まれているフィールドのこと
    • 埋め込みフィールドは親の構造体へ昇格、そこから直接呼び出せる
    • type studentType struct {scoreType}
    • 値の表示、fmt.Println(taro.points)
    • メソッド実行結果の表示、fmt.Printlm(taro.isPassed())
    • Go言語では型の継承はない、studentTypeとscoreTypeは同じ型ではない
    • 異なるデータ型でも、同じデータ型として扱いたい場合、インターフェースを活用する
    • インターフェースの使い方を確認するための準備
    • 英語と数学のカスタム型を作成、それぞれに合否判定メソッドを定義
    • レシーバーが異なれば、同じ名前のメソッドを宣言可能
    • e >= 80で条件分岐も可能だが、書き換え不可の場合もある
    • 条件式が真偽値として評価されるため、return e>= 80でOK
    • 英語、数学のカスタム型の変数を宣言
    • データ型をあわせる、englishScore := englishScoreType(90)
    • 結果を表示、fmt.Println(englishScore.isPassed())
    • true、falseにあわせてPass、Failを表示したい→次回
    • 実行結果をわかりやすく表示するための関数を追加(Pass、Fail)
    • 仮引数に2つのデータ型を書くことはできない
    • 同じ名前のメソッドを持っていたら、自動的に同じデータ型とみなす仕組み、インターフェース
    • type passChecker interface {isPassed() bool}
    • func showResult(score passChecker) {true、falseに応じて表示を変える}
    • showResult(englishScore)
    • 共通のメソッドがない場合の例
    • 空のインターフェース、interface{}、any
    • 0個以上のメソッドを実装したデータ型、つまりすべてのデータ型を受け取る
    • func showResult(score interface{}) {}
    • func showResult(score any) {}
    • scoreの結果エラー、ベースのデータ型がわからない、比較演算子が動作しない
    • 前回の続き、関数の中で受け取ったスコアがどの型なのか調べて条件分岐していく
    • 1つ目の方法、型アサーションで実装
    • scoreをenglishScore型として扱う
    • カンマOKイディオム、v, ok := score.(englishScoreType)
    • v、値
    • ok、englishScore型だとtrue、そうでなければfalseを返す
    • 書き換え if v, ok := score.(mathScoreType); ok {...}
    • 型アサーションの続き、コードを実行すると結果がおかしいので修正
    • 現状、2つの条件判定がされ、Invalid Scoreも表示される
    • 改善、条件判定後処理を止めて呼び出し元に戻す、returnを追加
    • returnに値を指定しない場合、関数の返り値の型を書く必要はない
    • 2つ目の方法、型switchで実装
    • switch v := score.(type) {case englishScoreType: ... default: ...}
    • score.(type)をvで受け、switchの中で使用可能

次におすすめのレッスン