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

嵌入struct
匿名struct其实是嵌入式struct,真实的访问方式如下:
