構造体 #
構造体を定義する #
構造体は名前が大文字始まりなら他のパッケージから読める「公開」状態となり、それ以外なら「非公開」となる。 フィールド名も同様に大文字なら「公開」それ以外なら「非公開」となる。
package main
import (
"fmt"
)
// 「type 構造体名 struct」で構造体の宣言
type S1 struct {
// フィールドの定義は「フィールド名 型名」
V1 int
V2 string
}
type s2 struct {
V1 bool
v2 string
}
func main() {
fmt.Printf("%#v\n", S1{}) // main.S1{V1:0, V2:""}
fmt.Printf("%#v\n", s2{}) // main.s2{V1:false, v2:""}
}
構造体を初期化する #
package main
import (
"fmt"
)
type S struct {
V1 int
V2 string
}
func main() {
// 変数宣言で初期化
var s0 S
fmt.Printf("%#v\n", s0) // == main.S{V1:0, V2:""}
// 初期化時に値を入れる
s1 := S{
V1: 100,
V2: "aaa",
}
fmt.Printf("%#v\n", s1) // == main.S{V1:100, V2:"aaa"}
// 構造体のポインタの初期化
s2 := &S{
V1: 100,
V2: "aaa",
}
fmt.Printf("%#v\n", s2) // == &main.S{V1:100, V2:"aaa"}
// new を使った構造体のポインタの初期化
s3 := new(S)
fmt.Printf("%#v\n", s3) // == &main.S{V1:0, V2:""}
}
構造体のフィールドの値の取得と更新をする #
package main
import (
"fmt"
)
type S struct {
V1 int
V2 string
}
func main() {
s1 := S{V1: 100, V2: "aaa"}
// 値の取得
v1 := s1.V1
fmt.Println(v1) // == 100
// 値の更新
s1.V2 = "bbb"
fmt.Printf("%#v", s1) // == main.S{V1:100, V2:"bbb"}
}