golang中是没有class的,但是有一个结构体struct。结构体是用户定义的类型,是一种聚合的数据类型,由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。
Go语言的struct,与C语言中的struct或C++语言中的类(class)类似。可以定义字段(属性)和方法。
结构体的声明
type Employee struct{
firstName string
lastName string
age int
}
在上面的代码片段里,声明了一个结构体类型 Employee。它有三个字段,分别为firstName 、lastName 、age 。
在上面的结构体中,firstName 、lastName 是属于相同的类型的。所以可以把结构体重写为:
type Employee struct{
firstName,lastName string
age int
}
上面的Employee 结构体是一个命名结构体。可以用Employee 类型创建结构体变量。如下:
var dilbert Employee
dilbert结构体变量的成员可以通过点操作符访问,比如dilbert.firstName和dilbert.age 。
例子:
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age int
}
func main() {
//使用字段名创建结构
emp1 := Employee{
firstName: "minger",
age: 25,
lastName: "minger-1",
}
//在不使用字段名的情况下创建结构
emp2 := Employee{"minger", "minger-2", 29}
fmt.Println("Employee 1", emp1)
fmt.Println("Employee 2", emp2)
}
输出结果:
创建了一个命名的结构体 Employee 。通过指定每个字段名的值,定义了结构体变量emp1 。字段名的顺序不一定要与声明结构体类型时的顺序相同。
定义了结构体变量emp2,省略了字段名。在这种情况下,就需要保证字段名的顺序与声明结构体时的顺序相同。
访问结构体的字段
通过变量名,使用点(.),可以访问结构体类型中的字段,或为字段赋值,也可以对字段进行取址(&)操作。
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age int
}
func main() {
emp := Employee{"minger", "ming", 23}
fmt.Println("First Name:", emp.firstName)
fmt.Println("Last Name:", emp.lastName)
fmt.Println("Age:", emp.age)
fmt.Println("================")
age := &emp.age
*age = 20
fmt.Println("Age:",emp.age)//20
}
编译输出:
结构体的指针
结构体与数组一样,都是值传递,比如当把数组或结构体作为实参传给函数的形参时,会复制一个副本。所以为了提高性能,一般不会把数组直接传递给函数,而是使用切片(引用类型)代替,而把结构体传给函数时,可以使用指针结构体。
指针结构体,即一个指向结构体的指针,声明结构体变量时,在结构体类型前加*号,便声明一个指向结构体的指针。
例子:
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age int
}
func main() {
emp := &Employee{"minger", "chen", 23}
fmt.Println("First Name:", (*emp).firstName)
fmt.Println("Last Name:", (*emp).lastName)
fmt.Println("Age:", (*emp).age)
}
编译输出:
注意:Go语言允许我们在访问 firstName字段时,可以使用emp.firstName 来代替显式的解引用 (*emp).firstName
匿名字段
创建结构体时,字段可以只有类型,而没有字段名,这样的字段字段称为匿名字段。
例子:
package main
import (
"fmt"
)
type Employee struct {
string
int
}
func main() {
emp := Employee{"Naveen", 50}
fmt.Println(emp)
}
编译输出:
在上面的程序中,结构体 Employee 有两个匿名字段。虽然匿名字段没有名称,但其实匿名字段名称就默认它的类型。
嵌套结构体
go语言当中的聚合和继承都是模拟出来的,子类是可以使用父类里的字段或功能,这样的结构体称为嵌套结构体。
package main
import (
"fmt"
)
type Address struct { //父类
city, state string
}
type Person struct { //子类
name string
age int
address Address //模拟继承:结构体的嵌套
}
func main() {
var p Person
p.name = "minger"
p.age = 23
p.address = Address {
city: "shenzhen",
state: "China",
}
fmt.Println("Name:", p.name)
fmt.Println("Age:",p.age)
fmt.Println("City:",p.address.city)
fmt.Println("State:",p.address.state)
}
编译输出:
你的关注,是我写作路上最大的鼓励!
喜欢本文的朋友,欢迎关注微信公众号(图一) “程序猿编码” 收看更多精彩文章。扫码二维码(图二),添加本人微信。备注:加群。即可加入**“程序猿编码”交流群**。