指针
指针是存储变量内存地址的变量,表达了这个变量在内存存储的位置。
我们常说:指针指向了变量。
Go中指针变量类型为*T,指向一个T类型的变量。
通过&操作符用于获取一个变量的地址。
b := 255 //声明变量
var a *int = &b // 通过&b获取变量地址,指针变量a指向了b,a值是b的地址
获取指针指向变量的值
- &b是获取变量b的地址。
- a = &b,将a指针指向b。
- 通过*a获取指针指向变量的值,我们叫
反解引用
。
函数使用传递指针参数
我们经常有类似的需求:
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
}
所以这种场景还是传递切片吧。
接口
接口常用的目的是:定义一个对象的行为。
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(){
// 一个指针接受者
}