2012-11-10 7 views
7

względu na konfigurację w 54th slide trasy golang:Dlaczego nie można zdefiniować metody zarówno dla struct, jak i dla jej wskaźnika?

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

Dlaczego nie może być również sposobem określonym w struktury, a także wskaźnik do struktury? Czyli:

func (v Vertex) Abs() float64 { 
    return math.Sqrt(v.X*v.X + v.Y*v.Y) 
} 

Definiowanie daje następujący błąd:

prog.go:41: method redeclared: Vertex.Abs 
    method(*Vertex) func() float64 
    method(Vertex) func() float64 
+0

[Zobacz również] (http://stackoverflow.com/q/13303254/720999) – kostix

Odpowiedz

11

Może. Po prostu zdefiniuj go na struct, a nie na wskaźniku. Będzie to rozwiązać oba sposoby

Method Sets

The method set of the corresponding pointer type *T is the set of all methods with receiver *T or T (that is, it also contains the method set of T)

Spróbuj żywo: 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()) 
} 
4

Rozważając na przykład:

type T U 

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

var t T 

... teraz możemy powołać M() na t pisząc t.M() jako język pozwala na wywołanie metody z odbiornikiem wskaźnika nawet na jego podstawowych (nie wskaźnikowych) wpisanych wystąpieniach, tj. staje się równoważny z (&t).M().

Jeśli będzie wolno teraz dodatkowo określić:

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

... to nie ma sposobu, aby powiedzieć, co jest teraz t.M() powinien wrócić.

Powiązane problemy