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()なりtます。t.M()(&t).M()

これで追加的に定義することが許可される場合:

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

...それでは、今何がt.M()返ってくるのかを知る方法はありません。

于 2012-11-10T21:16:03.840 に答える