Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么可以';不能同时为结构和指针定义方法吗?_Go - Fatal编程技术网

Go 为什么可以';不能同时为结构和指针定义方法吗?

Go 为什么可以';不能同时为结构和指针定义方法吗?,go,Go,根据golang tour中的设置: 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 m

根据golang tour中的设置:

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

例如,在考虑:

type T U

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

var t T
…我们现在可以通过编写
t.M()
来调用
t
上的
M()
,因为语言允许使用指针接收器调用方法,即使是在其底层(非指针)类型的实例上,也可以这样做,也就是说,它变得相当于
(&t).M()

如果现在允许额外定义:

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

…那么就没有办法知道现在应该返回什么了。

它可以。只需在结构而不是指针上定义它。这将从两方面解决问题

对应指针类型*T的方法集是所有 带有receiver*T或T的方法(也就是说,它还包含方法 一组(T)

尝试直播:

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


类型Abser接口未使用。@Tom L你是说你的IDE抱怨你的接口未使用?它可能看不到同一个库中实现接口的任何内容。您的实际观点或问题是什么?您出色的围棋示例(可以理解地反映了问题)也可以“双向解决”,而无需使用
键入Abser接口。
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())
}