はじめに
この実験では、Go 言語の構造体に関する知識をテストすることを目的としています。構造体は、フィールドの型付きコレクションで、データをまとめてレコードを形成するのに役立ちます。
構造体
この実験では、与えられた名前で新しい人間の構造体を構築する newPerson 関数を完成させる必要があります。person 構造体型には name と age のフィールドがあります。
person構造体型には必ずnameとageのフィールドがある必要があります。newPerson関数は、与えられた名前で新しい人間の構造体を構築する必要があります。newPerson関数は、新しく作成された人間の構造体へのポインタを返す必要があります。main関数は、以下の内容を出力する必要があります。- 名前が "Bob" で年齢が 20 歳の新しい構造体。
- 名前が "Alice" で年齢が 30 歳の新しい構造体。
- 名前が "Fred" で年齢が 0 歳の新しい構造体。
- 名前が "Ann" で年齢が 40 歳の新しい構造体へのポインタ。
newPerson関数を使用して構築された名前が "Jon" で年齢が 42 歳の新しい構造体。- 名前が "Sean" で年齢が 50 歳の構造体の
nameフィールド。 - 名前が "Sean" で年齢が 50 歳の構造体への構造体ポインタの
ageフィールド。 ageフィールドが 51 に更新された後の、名前が "Sean" で年齢が 50 歳の構造体への構造体ポインタのageフィールド。
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
以下が完全なコードです。
// Go 言語の _構造体_ は、フィールドの型付きコレクションです。
// データをまとめてレコードを形成するのに役立ちます。
package main
import "fmt"
// この `person` 構造体型には `name` と `age` のフィールドがあります。
type person struct {
name string
age int
}
// `newPerson` は、与えられた名前で新しい人間の構造体を構築します。
func newPerson(name string) *person {
// ローカル変数へのポインタを安全に返すことができます。
// ローカル変数は関数のスコープを超えて生存します。
p := person{name: name}
p.age = 42
return &p
}
func main() {
// この構文で新しい構造体を作成します。
fmt.Println(person{"Bob", 20})
// 構造体を初期化する際にフィールド名を指定することができます。
fmt.Println(person{name: "Alice", age: 30})
// 省略されたフィールドはゼロ値になります。
fmt.Println(person{name: "Fred"})
// `&` 接頭辞は構造体へのポインタを生成します。
fmt.Println(&person{name: "Ann", age: 40})
// コンストラクタ関数に新しい構造体の作成をカプセル化するのは慣例です。
fmt.Println(newPerson("Jon"))
// ドットを使って構造体のフィールドにアクセスします。
s := person{name: "Sean", age: 50}
fmt.Println(s.name)
// 構造体ポインタでもドットを使うことができます。
// ポインタは自動的に参照解除されます。
sp := &s
fmt.Println(sp.age)
// 構造体は可変です。
sp.age = 51
fmt.Println(sp.age)
}
まとめ
この実験では、Go 言語の構造体を使ってデータをまとめてレコードを形成する方法を学びました。また、新しい構造体を作成し、構造体のフィールドにアクセスし、構造体のフィールドを更新する方法も学びました。