method
Go does not have classes. However, you can define methods on types.
package main import ( "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: = & in p.Scale ( 2 ) fmt.Println (p.Abs ()) }
Output is as follows:
5
10
10
20
Note three points:
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 Vertex v.Scale(5) // OK p := &v p.Scale(10) // OK
3. methods with value receivers take either a value or a pointer as the receiver when they are called:
var v Vertex fmt.Println(v.Abs()) // OK p := &v fmt.Println(p.Abs()) // OK
interface
package main import ( "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() }
After half of the main function code error: can not use v (type T) as type I in assignment: T does not implement I (M method has pointer receiver)
If the receiver type to the M value:
func (t T) M() { fmt.Println(t.S) }
The main function of the code will function properly.
Reproduced in: https: //www.cnblogs.com/gattaca/p/7890726.html