2.5 结构体(struct)
Go的struct是字段的类型集合。
struct 主要应用两个方面:
可以将不同类型的数据存放到struct,我们都知道数组只能存放单一的数据类型.
由于在GO中没有class的关键字,也就是其它语言经常在面向对象中使用的方面,但GO是通过struct结构与method方法组合来实现的面向对象
示例:
package main
import (
"fmt"
)
type Person struct { //结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
a := Person{}
a.Name = "jerry" //对struct的属性进行操作,类型与class的使用方法
a.Age = 19
fmt.Println(a)
}
struct 作为一种类型和其他类型结合用
示例:
package main
import (
"fmt"
)
type Person struct {
//结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
m := map[string]Person{}
p := Person{Name: "jerry", Age: 12}
m["ONE"] = p
fmt.Println(m)
}
struct 面向对象示例
package main
import "fmt"
type Person struct {
//结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
p := Person{Name: "jerry", Age: 12}
p.list()
}
func (p *Person) list() {
fmt.Println(p.Name)
}
匿名字段
package main
import "fmt"
type YellowPerson struct {
Person //anonymous field(匿名自字段,名字就是Person)
string //anonymous field(匿名自字段,名字就是string)
}
type Person struct {
//结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
p := YellowPerson{Person: Person{Name: "jerry", Age: 12}, string: "jerry"}
fmt.Println(p.Person)
fmt.Println(p.Name)
fmt.Println(p.Age)
fmt.Println(p.string)
}
YellowPerson直接包含依赖结构,可以直接使用Person中的字段,sting 也是匿名字段,字段名字是string,不过不推荐这么使用。同时需要注意
type YellowPerson struct {
Person //anonymous field(匿名自字段,名字就是Person)
}
和
type YellowPerson struct {
Person Person
}
两者是不同的
package main
import "fmt"
type YellowPerson struct {
Person Person
string //anonymous field(匿名自字段,名字就是string)
}
type Person struct {
//结构也是一种类型
Name string //定义struct的属性
Age int
}
func main() {
p := YellowPerson{Person: Person{Name: "jerry", Age: 12}, string: "jerry"}
fmt.Println(p.Name)
fmt.Println(p.Age)
}
这个会报
p.Name undefined (type YellowPerson has no field or method Name),
p.Age undefined (type YellowPerson has no field or method Age)
错误,应为YellowPerson下没有Name 和Age这连个字段的。
匿名结构体
// 在函数外部定义匿名结构体并赋值给 config
var config struct {
APIKey string
OAuthConfig oauth.Config
}
// 定义并初始化并赋值给 data
data := struct {
Title string
Users []*User
}{
title,
users
}