指针是存储变量内存地址的变量,表达了这个变量在内存存储的位置。数组
咱们常说:指针指向了变量。函数
Go中指针变量类型为*T,指向一个T类型的变量。指针
经过&操做符用于获取一个变量的地址。code
b := 255 //声明变量 var a *int = &b // 经过&b获取变量地址,指针变量a指向了b,a值是b的地址
反解引用
。咱们常常有相似的需求:对象
func change(val *int){ *val = 55 }
看个复杂的例子:接口
a := 58 //变量a赋值 a=58 b := &a // b指向a,b存储了变量a的地址 change(b) //方法接受一个指针变量,在方法中进行反解,并赋值为55 // a此时被修改成55
咱们能够把一个数组经过指针传递传入一个方法,可是理解起来比较复杂,不是Go推荐的写法,这种状况一般采用切片来处理。内存
func modify(sis []int){ sls[0] = 90 } func main(){ a := [3]int{89,90,91} modify(a[:]) // 输出90,90,91 }
因此这种场景仍是传递切片吧。string
接口经常使用的目的是:定义一个对象的行为。it
Go中,当一个类型定义了接口中的全部方法,此类型就实现了该接口。变量
type SalaryCalculator interface{ CalculateSalary() int } type Permanent struct{ empId int basicpay int pf int } type Contract struct{ empId int basic pay int } func (p Permanent) CalculateSalary() int{ return p.basicpay + p.pf } func (c Contract) CalculateSalary() int{ return c.basicpay }
没有包含方法的接口称为空接口,空接口表示为interface{}
,全部类型都实现了空接口。
Func findType(I interface{}){ switch I.(type) // 经过这种方法获取空接口对应的类型 }
type Describer interface{ Describe() } type Address struct{ state string country string } func (a *Address) Describe(){ // 一个指针接受者 }