指針
指針是存儲變量內存地址的變量,表達了這個變量在內存存儲的位置。
我們常說:指針指向了變量。
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(){
// 一個指針接受者
}