【Go入門】Golang基礎入門+αの備忘録#3(ポインタ)の続き。
この記事は以下のUdemyコースの学習記録です。
重要だと思った部分や感想、復習用に何を学んだかを書いていきます。
セクション11:構造体
struct
− User型の構造体があったとしたとき、以下のように記述することでUser型の構造体をポインタ型で初期化できる。
user1 := new(User)
明示的にポインタ型として宣言する場合は以下の様に記述するのが主流。
user1 := &User{}
structメソッド
メソッドの呼びだし型
構造体名.メソッド名(引数)
ポインタ型のReceiverを使うことで、構造体のフィールドを更新できる。
func (Receiver名 *型) 任意のメソッド名(フィールド名 型) {構造体のフィールドを更新する処理}
メソッドを呼び出す側は引数はポインタ型にしなくて良い。
func (u *User) setName(name string) {
u.Name = name
}
func main() {
user1 := User{Name: "user1"}
user1.SetName("user2") // メソッドを呼び出す側は引数はポインタ型にしなくて良い。
}
struct埋め込み
- 構造体のフィールドに構造体を埋め込むことができる。構造体が埋め込まれたフィールドは型を省略できる。省略した場合に限り、埋め込まれた構造体のフィールドを直接参照できる。
コンストラクタ関数
- Goではコンストラクタ関数は構造体のポインタを返す形式で実装するのが一般的。
- 構造体を返すコンストラクタ関数を使って、構造体のポインタを生成することができる。またコンストラクタ関数の引数は、構造体のフィールドに適した型の値を渡す。
構造体のインスタンス名 := コンストラクタ関数(コンストラクタ関数内で返されている構造体のフィールドに適した型の値を引数として渡す)
struct slice
- ポインタの構造体のスライス型を学んだ。
- ポインタの構造体のスライスの中身を取り出すには、範囲式for文でスライス内の各構造体のアドレスを取得する(デリファレンス)。
- make関数で構造体のスライスを生成できる。
type SampleStruct struct {
field1 string
field2 int
}
type SampleStructs []*SampleStruct
func main() {
struct1 := SampleStruct{field1: "a", field2: 1}
struct2 := SampleStruct{field1: "b", field2: 2}
sl := make([]*SampleStruct, 0)
sl = append(sl, &struct1, &struct2)
for _, s := range sl {
fmt.Println(*s)
}
}
struct map
- mapのキーと値両方に構造体をもたせることができる。
struct 独自型
- あるデータの型を厳しくしたい時、独自型を使うことで他のデータ型と計算をできないようにできる。
- int型のsample型(
sample型とint型同士の演算はコンパイルエラーになる
)
type sample int
セクション12:interface
主に、型アサーション、ダックタイピング、独自のエラーをカスタムエラーとして定義する、表示形式のカスタマイズに用いられる。
セクション13:パブリックとプライベートと分割
- Goは基本的に関数や変数をパッケージ毎に分割してそれを組み合わせて開発していく。
- パッケージ間でのデータのやり取り
- 慣習として、Go Modulesを使って、フルパスでパッケージを指定する。
- パッケージのインポート順は可読性の観点から、アルファベットが推奨。
- 標準パッケージ、独自パッケージ、サードパーティパッケージは分けて並べた方が良い。
- インポートしたパッケージが使わないとコンパイルエラーになる。
- Goのスコープの大小関係はパッケージ→ファイル→関数→ブロック→制御構文
- パッケージ間でデータを参照するにはデータをエクスポートする必要がある。
- 1文字目を大文字にすることでエクスポートできる。
- パッケージ名+ドット+変数名(例)で参照可能
- 複数パッケージインポートした時、識別子の重複によるエラーを防ぐ必要があるため、パッケージ名の省略は推奨されていない。
セクション14:テスト
- テスト用の関数名は先頭にTestをつける。
- テストをしたいファイルと同じ階層にテスト用のファイルを作る。
- Goのテストのルールとしてパッケージ名_test.goというファイル名でテストファイルを作る。