2012-11-10 29 views
7

Với thiết lập trong 54th slide của các tour du lịch golang:Tại sao không thể định nghĩa một phương thức cho cả cấu trúc và con trỏ?

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

Tại sao có thể không phải là một phương pháp cũng được định nghĩa cho các cấu trúc cũng như các con trỏ đến struct? Đó là:

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

Định nghĩa này mang lại cho các lỗi sau:

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

[Xem thêm] (http://stackoverflow.com/q/13303254/720999) – kostix

Trả lời

11

Có thể. Chỉ cần xác định nó trên cấu trúc và không phải là con trỏ. Nó sẽ giải quyết cả hai cách

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)

Cố gắng sống: 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

Trong khi xem xét ví dụ:

type T U 

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

var t T 

... bây giờ chúng ta có thể gọi M() trên t bằng cách viết t.M() như ngôn ngữ cho phép gọi một phương thức với một bộ nhận con trỏ ngay cả trên các cá thể đã nhập (không có con trỏ) cơ bản của nó, tức là nó trở thành tương đương với (&t).M().

Nếu nó sẽ được phép đến nay additionaly xác định:

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

... sau đó không có cách nào để nói những gì tại t.M() có nghĩa vụ phải trả.

Các vấn đề liên quan