为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不能同时为结构及其指针定义方法?

为什么不能同时为结构及其指针定义方法?

Go
慕森王 2021-05-14 18:27:48
给定golang巡回演出的第54张幻灯片中的设置:type Abser interface {    Abs() float64}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) Abs() float64 {    return math.Sqrt(v.X*v.X + v.Y*v.Y)}定义此错误将导致以下错误:prog.go:41: method redeclared: Vertex.Abs    method(*Vertex) func() float64    method(Vertex) func() float64
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

它可以。只需在结构而不是指针上定义它即可。它将解决两种方式


方法集


指针类型* T的方法集是接收者* T或T的所有方法的集(也就是说,它也包含T的方法集)


尝试直播:http://play.golang.org/p/PsNUerVyqp


package main


import (

    "fmt"

    "math"

    )


type Abser interface {

    Abs() float64

}


type Vertex struct {

    X, Y float64

}


func (v Vertex) Abs() float64 {

    return math.Sqrt(v.X*v.X + v.Y*v.Y)

}


func main() {

    v := Vertex{5, 10}

    v_ptr := &v

    fmt.Println(v.Abs())

    fmt.Println(v_ptr.Abs())

}

更新:根据评论,我创建了一个额外的示例,该示例实际上利用Abser接口来说明值和指针都满足该接口。


https://play.golang.org/p/Mls0d7_l4_t


查看完整回答
反对 回复 2021-05-24
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

例如,在考虑时:


type T U


func (t *T) M() int { return 1 }


var t T

...我们现在可以通过编写来调用M(),t只要t.M()语言允许,即使在其基础(非指针)类型的实例上,也可以使用指针接收器调用方法,即,它等效于(&t).M()。


如果现在允许它另外定义:


func (t T) M() int { return 2 }

...然后无法告诉现在t.M()应该返回什么。


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信