go结构体
和其他面向对象的语言不同,go 并没有 class 的概念。在处理复杂类型时,go 使用结构体 struct 。
1. struct定义
struct 是一组属性的集合,定义语法如下:
type MyStruct struct {
firstName string
lastName string
age int
}
这个 struct 名为 MyStruct,它拥有三个属性,分别为 string 类型的 firstName,string 类型的 lastName 和 int 类型的 age。
用结构体声明变量时,默认结构体里面的每一个属性会被赋予该属性对应类型的零值(string 对应空字符串,数值型对应0)。也可以在声明变量时对结构体的属性进行初始化。
package main
import "fmt"
type MyStruct struct {
firstName string
lastName string
age int32
}
func main() {
var a MyStruct
fmt.Printf("firstName : %s, lastName : %s , age : %d", a.firstName, a.lastName, a.age)
var b MyStruct = MyStruct{
firstName: "lin",
lastName: "lan",
age: 12,
}
fmt.Printf("\nfirstName : %s, lastName : %s , age : %d", b.firstName, b.lastName, b.age)
}
2. 匿名属性
struct 允许匿名属性,属性类型即为属性的名字,因为 struct 属性名字不能重复,故相同类型的匿名属性最多只能一个。
package main
import "fmt"
type MyStruct struct {
string
int
}
func main() {
var b MyStruct = MyStruct{
string: "lin", //属性类型作为属性名称
int: 12,
}
fmt.Printf("\nstring : %s, int : %d", b.string, b.int)
}
3. 匿名结构体
go 支持匿名结构体,和 Java 匿名类类似,例如:
package main
import (
"fmt"
)
func main() {
emp3 := struct {
firstName string
lastName string
age int
salary int
}{
firstName: "Andreah",
lastName: "Nikola",
age: 31,
salary: 5000,
} //没有type structName 这样的定义
fmt.Println("Employee 3", emp3)
}
4. 指向结构体的指针
对结构体执行取地址&
操作,可以获得指向结构体的指针,通过这个指针可以访问结构体的属性。
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
first string
second int
}
func main() {
var b = &MyStruct{
first: "lin",
second: 12,
}
fmt.Printf("\ntype of b is %s", reflect.TypeOf(b))
fmt.Printf("\nstring : %s, int : %d", b.first, b.second)
}
提示
go 支持直接使用指针访问元素,b.first
等同于(*b).first
5. 结构体嵌套
struct 的属性可以为另一个 struct。例如:一个学生拥有一个地址,而地址是一个 struct,它包含省、市、区等信息。
package main
import "fmt"
type Address struct {
province string
city string
area string
}
type Student struct {
Address
age int32
}
func main() {
var student Student = Student{
Address: Address{
province: "河北",
city: "石家庄",
area: "杨浦区",
},
age: 16,
}
fmt.Printf("\nstudent age %d, his area is %s", student.age, student.area)
}
6. Promoted Field
struct 支持匿名属性,当这个属性为结构体时,struct 可以直接访问这个内嵌结构体里面的属性,这被称为 Promoted Field 。上面例子里,student.area
即为 Promoted Field。