一尘不染

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

go

给定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

阅读 222

收藏
2020-07-02

共1个答案

一尘不染

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

方法集

对应的指针类型 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

2020-07-02