7

鉴于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
4

2 回答 2

11

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

方法集

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

于 2012-11-10T21:19:39.993 回答
4

在考虑例如:

type T U

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

var t T

...我们现在可以通过编写调用M()on ,因为语言允许调用带有指针接收器的方法,即使在其底层(非指针)类型实例上,即它变得等价于.tt.M()(&t).M()

如果现在允许额外定义:

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

...那么没有办法告诉现在t.M()应该返回什么。

于 2012-11-10T21:16:03.840 回答