這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
method
Go does not have classes. However, you can define methods on types.
package mainimport ( "fmt" "math")type Vertex struct { X, Y float64}func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y)}func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f}func (v Vertex) ScaleValue(f float64) { v.X = v.X * f v.Y = v.Y * f}func main() { v := Vertex{3, 4} fmt.Println(v.Abs()) v.Scale(2) fmt.Println(v.Abs()) v.ScaleValue(2) fmt.Println(v.Abs()) p := &v p.Scale(2) fmt.Println(p.Abs())}
輸出如下:
5
10
10
20
三個注意點:
1. Methods with pointer receivers can modify the value to which the receiver points 。
2. methods with pointer receivers take either a value or a pointer as the receiver when they are called:
var v Vertexv.Scale(5) // OKp := &vp.Scale(10) // OK
3. methods with value receivers take either a value or a pointer as the receiver when they are called:
var v Vertexfmt.Println(v.Abs()) // OKp := &vfmt.Println(p.Abs()) // OK
interface
package mainimport ( "fmt")type I interface { M()}type T struct { S string}func (t *T) M() { fmt.Println(t.S)}func main() { var i I t := T{"hello"} i = &t i.M() v := T{"world"} i = v i.M()}
main函數後半段代碼會報錯:cannot use v (type T) as type I in assignment: T does not implement I (M method has pointer receiver)
如果把M的receiver類型改成value:
func (t T) M() { fmt.Println(t.S)}
main函數的代碼將正常運行。