strcut简介:
go语言中是没有类的,但是并不能说go语言不能支持面向对象编程,python或java中使用类来实现封装,继承,等特性。在go语言中是没有继承这一概念的。替代的方案是使用组合,结构体是实现组合的载体。通过结构体的嵌入,可以将不同结构体组合在一起,从而将每个结构体自带的方法都加入到一个方法集。
自定义strcut的两种方法
var myStruct struct {//方法一
number float64
word string
toggle bool
}
type car struct {//方法二
description string
cost int
}
myStruct.number = 3.14
var porsche car
porsche.description = "mycar"
porsche.cost = 100
类型遮盖
package main
type car struct {
description string
cost int
}
func main() {
myStruct.number = 3.14
var car car//类型遮盖
car.description = "mycar"
car.cost = 100
var car2 car
//类型遮盖问题,自定义变量名car覆盖了自定义的类型变量car
//在实际应用种,类型一般是在其它程序包种导入,变量名为大写eg:Car
//而自定义变量一般为小写car
}
传递struct变量指针
在第一篇中,提到过,结构体是值类型数据,传入函数时,是以传值的方式传入的。即将结构体的值得一份拷贝传入了函数,在函数中修改值,并不会改变结构体得值。对所以要想令函数改变结构体得值应该使用指针,传递指针,也可以避免参数拷贝造成的内存浪费
package main
import "fmt"
type subsciber struct {
name string
rate float64
active bool
}
func applyDiscount(s *subsciber) {
s.rate = 4.99
//更新struct变量的字段
}
func main() {
var s subsciber
applyDiscount(&s)
//传入变量s的地址
fmt.Println(s.rate)
}
结构体的指针访问字段
将struct作为字段—字段嵌入
package magazine
type Subsciber struct {
Name string
Rate float64
Active bool
HomeAddress Address
//需要在多个结构体中重用的字段
//建议设置为结构体字段
}
type Employee struct {
Name string
Salary float64
HomeAddress Address
}
type Address struct {
Street string
City string
State string
PostCode string
}
func main() {
address := Address{Street: "xinda", City: "xian", State: "shanxi", PostCode: "710600"}
subscriber1 := Subsciber{Name: "uni"}
subscriber1.HomeAddress = address
fmt.Println(subscriber1.HomeAddress)
employee := Employee{Name: "uni"}
employee.HomeAddress.City = "beijing"
employee.HomeAddress.PostCode = "8900"
}
匿名strcut字段
嵌入struct
匿名struct其实是嵌入式struct,真实的访问方式如下: