结构体是用户自定义的类型,让业务声明更紧凑。编程
type Employee struct{ firstName string lastName string age int }
赋值:编程语言
emp1 := Employee{ firstName : “Sam”, age : 25, lastName : “Anderson”, }
或者:函数
emp2 := Employee{“Thomas”, 29, “Paul”} // 这种状况下须要保持和结构体中顺序同样
经过操做符 . 进行字段访问。指针
emp1.firstName emp1.lastname emp1.age
经过这种方式对结构体赋值:code
var emp2 Employee // 建立零值struct,都是默认值 emp2.firstName = “Jack” emp2.lastName = “Adams”
emp3 := &Employee{“sam”,”anderson”,55} // 建立指向结构体指针 (*emp3).firstName // 经过*反解获取指针指向变量,获取变量值
或者采用emp3.firstName方式显示反解。对象
若是结构体名称以大写字母开头,说明它是其余能够访问导出类型,结构体中字段首字母大写,说明它能够被其余包访问到。string
好比咱们能够在src目录下建立名字structs的文件夹,在里面建立结构体源文件。面向对象编程
结构体是值类型,若是两个结构体每一个字段都是可比较的(int,string),且变量字段相等,则说明两个结构体相等。ast
若是结构体中包含不可比较字段(map),则结构体是不可比较的。变量
方法就是一个函数,区别是func和方法名之间加入一个接收器类型,接收器能够是结构体类型或者非结构体类型,能够在方法内部访问这个接收器。
func (t Type) methodName(parameter list){ } // 好比 type Employee struct{ name string salary int currency string } func (e Employee) displaySalary(){ } // 接收器调用 e.displaySalary()
上面例子都是基于值的接收器,指针接收器和值接收器的区别在于,指针接收器的方法内部的改变对于调用者是可见的,这一直也是指针的特色。
在Go中,若是变量是e *Employee的指针,可直接使用e.属性,直接反解。
指针接收器使用在:对方法内部接收器所作改变须要对调用者可见时。
通常是如下场景: