函数
值参数是值传递
package main
import (
"fmt"
)
type Vertex struct {
X, Y float64
}
func update(v Vertex){
v.X = 2
v.Y = 2
}
func main() {
v := Vertex{3, 4}
update(v)
fmt.Println(v)
}
// {3 4}
指针参数是引用传递
package main
import (
"fmt"
)
type Vertex struct {
X, Y float64
}
func update(v *Vertex){
v.X = 2
v.Y = 2
}
func main() {
v := Vertex{3, 4}
update(&v)
// update(v) 报错:cannot use v (type Vertex) as type *Vertex in argument to update
// 指针参数只能传指针
fmt.Println(v)
}
// {2 2}
方法
与函数规则相同
唯一区别,值可以调用指针方法,指针也可以调用值方法
package main
import (
"fmt"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) update(){
v.X = 2
v.Y = 2
}
func main() {
v := Vertex{3, 4}
v.update() // go 会将 v.update() 解释为 (&v).update()
fmt.Println(v)
}
// {2 2}
package main
import (
"fmt"
)
type Vertex struct {
X, Y float64
}
func (v Vertex) update(){
v.X = 2
v.Y = 2
}
func main() {
v := Vertex{3, 4}
(&v).update() // GO 会自动做一次(*(&v)).update()
fmt.Println(v)
}
// {3 4}