go语言中 *和&符号的一些疑惑。

type Abser interface {
    Abs() float64
}

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    v := Vertex{3, 4}
    fmt.Println(v.Abs())
    a = f  
    a = &v  //第一句
    fmt.Println(a.Abs())
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {  //第二句
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

1,如果我将”星号Vertex”中的”*”去掉,”a = &v”中的”&”有或没有看起来都没什么区别。

func main() {
    v := &Vertex{3, 4}   //第一句
    fmt.Println(v.abs(6, 8))
}

func (v *Vertex) abs(a, b float64)//第二句 float64 {
    return math.Sqrt(a*a + b*b)
}

2,”v := &Vertex{3, 4}”和”v 星号Vertex”中的*和&有或没有,运行的结果都没有区别。这又是什么原因呢

共 4 个回复


jimmykuu

func (v *Vertex) Abs() float64 这种写法其实是个语法糖,其实就是 func Abs(v *Vertex) float64,等于说传入的参数是地址,如果没有星号传入的就是值,和你在外面的变量前面是否加 & 没有关系。

第二个问题和第一个问题其实是同一个问题。

# 0

HOOHyou

@jimmykuu
感谢你的回答。

func (v *Vertex) Abs() float64 这种写法其实是个语法糖,其实就是 func Abs(v *Vertex) float64

根据我在Go指南上学的,看到的是这种写法主要是为了在Vertex结构体上定义Abs方法,然后可以用a.Abs()来调用这个方法。

如果是func Abs(v *Vertex) float64 这样的写法,那就是传参了,然后我根据你说的这样修改了一下代码,就会报错。
不知道对于这样的语法是否还有其他解释,谢谢

# 1

yjbdsky

func (v *Vertex) Abs() float64 函数定义中第一个括号就可选参数啊

# 2

Yuki_xing

指针接收者用T这种文法用的是指针单独定义的文法,并不是下面一个取值的文法
1.png
2.png

# 3