接口与指针/值接收器

如果我使用指针接收器,以下代码有异常,a=v因为它是在指针 v 上定义的,这是有道理的。


package main

import (

    "fmt"

    "math"

)


type Abser interface {

    Abs(x int) float64 //all types needs to implement this interface

}


type Vertex struct {

    X float64

}


func (v *Vertex) Abs(x int) float64 {

    return math.Abs(float64(x))

}



func main() {


    /*define the interface and assign to it*/

    var a Abser

    v := Vertex{-3}

    a = &v

    fmt.Println(a.Abs(-3))


    a = v

    fmt.Println(a.Abs(-3))

}

但是,如果我将 Abs 的功能更改为


func (v Vertex) Abs(x int) float64 {

    return math.Abs(float64(x))

}

两者都a=v有效a=&v,这背后的原因是什么?


30秒到达战场
浏览 92回答 1
1回答

繁星coding

像这样理解它,因为我没有合适的资源来引用答案;当接口在值上实现时,Go 很乐意将指针结构的副本作为值传递,您可以通过打印变量的地址来检查这一点;这是因为这个操作被认为是安全的并且不能改变原始值;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go