Go 结构体和方法

结构体

结构体是用户自定义的类型,让业务声明更紧凑。编程

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不是纯粹的面向对象编程语言,Go不支持类,因而基于类型的方法能够实现相似于类行为。
  • 相同名字的方法能够定义在不一样的类型上,相同名字的函数是不被容许的。

指针接收器

上面例子都是基于值的接收器,指针接收器和值接收器的区别在于,指针接收器的方法内部的改变对于调用者是可见的,这一直也是指针的特色。

在Go中,若是变量是e *Employee的指针,可直接使用e.属性,直接反解。

什么时候使用值接收器,什么时候使用指针接收器

指针接收器使用在:对方法内部接收器所作改变须要对调用者可见时。

通常是如下场景:

  • 当拷贝一个结构体代价过于昂贵时,好比结构体有不少字段。这时使用指针接收器,结构体不会被拷贝,只会传递一个指针到方法内部使用。
  • 其余状况值接收器和指针接收器能够共同使用。
相关文章
相关标签/搜索