はじめに
構造体 (struct) は、さまざまな型のデータを格納するために使用できる複合型です。より複雑なデータ構造を実装するために使用できます。たとえば、コンビニエンスストアの商品には、商品名、カテゴリ、価格などの属性があります。これらを表現するために構造体を使用できます。
この実験では、構造体の定義と使用方法について学びます。
学習項目:
- 構造体の定義
- 構造体インスタンスのメソッド
構造体の定義
構造体を定義するには、キーワード type と struct を使用します。構文は次のとおりです。
type StructName struct {
FieldName Type
//...
}
ここで:
- Type はフィールド名の特定の型を表し、整数や文字列などです。
- StructName は同じパッケージ内で一意でなければなりません。
- フィールド名 は同じ構造体内で一意でなければなりません。
試してみましょう。コンビニエンスストアを定義しましょう。
type Store struct {
ProductType string // 商品の種類
ProductName string // 商品名
Price int // 商品価格
}
上記のコードでは、コンビニエンスストア用に Store という名前の構造体を定義しており、商品の種類、名前、価格が含まれています。
商品の種類と商品名のフィールドが同じ型であるため、コードを次のように簡略化できます。
type Store struct {
ProductName, ProductType string
Price int
}
var を使ったインスタンス化
前節では、コンビニエンスストアの構造体 Store を定義しました。これはメモリ空間を記述しています。インスタンス化されるまでは、メモリが割り当てられず、構造体のフィールドも使用されません。
構造体をインスタンス化するには、var キーワードを使用できます。
var InstanceName Structure
インスタンス化の例を見てみましょう。struct.go という名前のファイルを作成し、次のコードを書きます。
cd ~/project
touch struct.go
package main
import "fmt"
type Store struct {
productName string
productType string
price int
}
func main() {
// `var` を使って構造体をインスタンス化する
var store1 Store
// インスタンス store1 に関連するフィールドに値を割り当てる
store1.productType = "Drinks"
store1.productName = "Coca-Cola"
store1.price = 3
fmt.Printf("store1:\n\t%s\n\t%s\n\t%d\n",
store1.productType, store1.productName, store1.price)
}
プログラムを実行します。
go run struct.go
実行すると、次の結果が表示されます。
store1:
Drinks
Coca-Cola
3
このプログラムでは、var を使ってコンビニエンスストアをインスタンス化し、その後 . 演算子を使ってフィールドに値を割り当てました。
構造体の初期値
インスタンス化された構造体に値を割り当てずに初期化するだけでは、どのような値になるでしょうか。次のコードを見てみましょう。
package main
import "fmt"
type Store struct {
ProductName string
ProductType string
Price int
}
func main() {
// `var` を使って構造体をインスタンス化する
var lan1 Store
// %#v を使って構造体の値を表示する
fmt.Printf("lan1: %#v\n", lan1)
}
プログラムを実行します。
go run struct.go
結果は次のとおりです。
lan1: main.Store{ProductName:"", ProductType:"", Price:0}
初期値を指定しない場合、インスタンス化された構造体の値は対応する型のゼロ値になることがわかります。たとえば、文字列は空で、整数は 0 です。
new を使ったインスタンス化
インスタンス化に var キーワードを使用する他に、new キーワードも使用できます。
package main
import "fmt"
type Store struct {
productName string
productType string
price int
}
func main() {
store := new(Store)
// %T を使って型を出力する
fmt.Printf("Type of store: %T\n", store)
store.productType = "Daily Necessities"
store.productName = "Umbrella"
store.price = 20
fmt.Printf("store:\n\t%s\n\t%s\n\t%d\n",
store.productType, store.productName, store.price)
}
プログラムを実行します。
go run struct.go
結果は次のとおりです。
Type of store: *main.Store
store:
Daily Necessities
Umbrella
20
new キーワードを使ってインスタンス化する場合、作成される「インスタンス」は実際にはインスタンスへのポインタです。構造体ポインタに値を割り当てる操作は、通常の構造体に値を割り当てる操作と同じです。
:= を使ったインスタンス化
同様に、構造体をインスタンス化するには := を使用できます。
package main
import "fmt"
type Store struct {
productName string
productType string
price int
}
func main() {
lan3 := Store{}
lan3.productType = "Fresh Food"
lan3.productName = "Taiwanese Meatballs"
lan3.price = 20
fmt.Printf("lan3:\n\t%s\n\t%s\n\t%d\n",
lan3.productType, lan3.productName, lan3.price)
}
プログラムを実行します。
go run struct.go
結果は次のとおりです。
lan3:
Fresh Food
Taiwanese Meatballs
20
初期化と代入を一緒に書くこともできます。
package main
import "fmt"
type Store struct {
productName string
productType string
price int
}
func main() {
lan3 := Store{
productType: "Fresh Food",
productName: "Taiwanese Meatballs",
price: 4,
}
fmt.Printf("lan3:\n\t%s\n\t%s\n\t%d\n",
lan3.productType, lan3.productName, lan3.price)
}
プログラムを実行します。
go run struct.go
結果は次のとおりです。
lan3:
Fresh Food
Taiwanese Meatballs
4
構造体のすべてのフィールドに値を割り当てる必要がある場合、構造体で定義されている順序で値を書くことができます。
たとえば、lan3 インスタンスを次のように書き換えます。
lan3 := Store{
"Fresh Food",
"Taiwanese Meatballs",
4,
}
注:この構文は、すべてのフィールドに値を割り当てる場合にのみ適用されます。
まとめ
この実験では、構造体を紹介し、以下の知識ポイントをまとめました。
- 構造体は、複数の異なるデータ型を含む複合データ型です。
- 初期化されていない構造体の値は、対応する型のゼロ値です。
- 構造体をインスタンス化する 3 つの方法。



