構造体
1. type キーワード
type は次の用途で使います。
構造体の宣言
インターフェースの宣言
型エイリアスの宣言
新しい型の定義
型スイッチや型アサーションでも関連する構文を使う
1.1. 型エイリアス
別名を付けると意図が伝わりやすくなります。エイリアスは元の型を指し、独立した型を作るものではありません。
//以定义int的别名举例
type MyInt = int
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为int,相当一给int取了一个小名,MyInt本质上还是int
1.2. 定義型
既存の基底型から新しい型を定義できます。基底型には int、string、構造体などがあり、構造体なら名前付きの複数フィールドを持てます。用途に合うデータ構造を表現できます。
type MyInt int // 相比于类型别名,没有等号
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为xxxx.MyInt
新しい型を定義する意味
メソッドを持たせ、用途を明確にできます。
func (mi MyInt) string() string{
return strconv.Itoa(int(mi))
}
func main(){
var i MyInt = 10
fmt.Println(i.string())
}
// 上面的代码给MyInt增加了一个string方法,这样就可以将MyInt类型转换为string类型
2. 構造体の宣言と初期化
Go の構造体は、C の構造体の簡潔さと、メソッドによるオブジェクト指向的な構成を組み合わせています。
名前、年齢、住所、携帯番号などを保存する場合、次のように構造体を定義できます。
type Person struct{
name string
age int
address string
mobile string
}
func main(){
//结构体的初始化方式
p1 := Person{"小明", 18, "北京", "13812345678"} //省略写法每个元素都要写
p2 := Person{name: "小红", age: 19, address: "上海", mobile: "13812345679"} //能够填部分元素,更灵活
var p3 Person
p3.name = "小刚"
var persons []Person
persons = append(persons, p1)
persons = append(persons, Person{"小刚", 20, "广州", "13812345680"})
}
3. 無名構造体
一時的なフィールドのまとまりには、無名構造体を使えます。
address := struct{
province string
city string
district string
}{
"北京",
"北京",
"海淀区"
}
fmt.Println(address.city)
4. 構造体の入れ子
構造体のフィールドとして、別の構造体を持てます。
type Person struct{
name string
age int
}
// 可以不用重复定义
type Student struct{
// 第一种嵌套方式
p Person
score float32
}
func main() {
// 第一种初始化方式
s := Student{
p: Person{
name: "小明",
age: 18,
},
score: 90,
}
fmt.Println(s.p.name)
// 第二种初始化方式
s := Student{}
s.p.name = "小明"
}
埋め込みフィールド
type Person struct{
name string
age int
}
// 可以不用重复定义
type Student struct{
// 第二种嵌套方式--匿名嵌套
Person
score float32
}
func main() {
// 初始化方式
s.name = "小明"
}
5. 構造体のメソッド
構造体型にメソッドを定義します。
Go のメソッドは、構造体の宣言の外に記述します。
type Person struct{
name string
age int
}
func (p Person) print(){
fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}
func main() {
p := Person{
name: "小明",
age: 18,
}
p.print()
}
元の構造体のフィールドを変更する場合は、ポインタレシーバを使います。
type Person struct{
name string
age int
}
func (p *Person) print(){
p.age = 19
fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}
func main() {
p := Person{
name: "小明",
age: 18,
}
p.print()
}
//此时输出的结果为:姓名:小明, 年龄:19