Go語言學習:每日一練3
目錄
- Go語言學習:每日一練3
- 方法
- 接口
- 繼承
- 類型斷言
方法
方法是一類有接收者參數的函數。
接收者的類型定義和方法的聲明必須在一個包里
type MyInt intfunc (m MyInt) Add(add int) int {return int(m) + add
}
//OR
func (m *MyInt) Add(add int) int {return int(m) + add
}
func main() {v := MyInt(12)fmt.Println(v.Add(1))
}
- 接收者值傳遞
- go的優化–調用的時候不需要區分接受者是指針還是源類型
//等價的
func (reciever Vertex) Test() {}
func Test(receiver Vertex) {}
接口
接口類型的定義為一組方法簽名。
接口類型的變量可以持有任何實現了這些方法的值。
type Abser interface{Abs() float64
}
type Vertex struct {X, Y float64
}
func (v *Vertex) Abs() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {v := Vertex{3, 4}var abser Abserabser = &v
//方法定義的接受者為指針,所以接口的變量只能持有一個指針
//但接收值為源類型的時候,接口的變量沒有持有限制。
}
繼承
go沒有提供繼承的機制,但是又類似于繼承的處理方式。
type Inner struct {name string
}type Outer struct {InnerInner2 Innerstring
}
func (inner Inner) SayName() {fmt.Println(inner.name)
}
當結構體中存在匿名字段的時候,結構體可以直接訪問其屬性和方法,看起來像繼承了一樣。
func main() {out := Outer{Inner{"hello"},Inner{"world"},"111"}fmt.Println(out.name)out.SayName()fmt.Println(out.string)
}
類型斷言
類型斷言提供了一種訪問接口底層具體值的方法
t := i.(T) //失敗會觸發panict, ok = i.(T) //更推薦的語法
類型選擇
switch v := i.(type) {case int:fmt.Printf("二倍的 %v 是 %v\n", v, v*2)case string:fmt.Printf("%q 長度為 %v 字節\n", v, len(v))default:fmt.Printf("我不知道類型 %T!\n", v)}