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

时间:2012-11-10 21:07:58

标签: go

鉴于golang之旅54th slide中的设置:

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)
}

为什么不能为struct定义一个方法以及指向struct的指针?那就是:

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 个答案:

答案 0 :(得分:11)

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

Method Sets

  

相应指针类型* T的方法集是all的集合   接收器* 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())
}

答案 1 :(得分:4)

虽然考虑例如:

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()应该返回什么。