跳到主要内容

go结构体

 和其他面向对象的语言不同,go 并没有 class 的概念。在处理复杂类型时,go 使用结构体 struct

1. struct定义

struct 是一组属性的集合,定义语法如下:

type MyStruct struct {
firstName string
lastName string
age int
}

 这个 struct 名为 MyStruct,它拥有三个属性,分别为 string 类型的 firstNamestring 类型的 lastNameint 类型的 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


  1. Structures in Go
  2. Structs

署名-非商业性使用-禁止演绎 4.0 国际