2014-07-06 14 views
6

Chương trình này không biên dịch:loại Impossible chuyển đổi trường hợp

package main 

type Validator struct { 
} 

// Error implements error interface 
func (v *Validator) Error() string { 
    return "" 
} 

func test() error { 
    return &Validator{} 
} 

func main() { 
    switch test().(type) { 
    case nil: 
     println("No error") 
    case Validator: 
     println("Validation error") 
     return 
    default: 
     println("Unknown error") 
     return 
    } 
} 

Lỗi này là:

prog.go:19: impossible type switch case: test() (type error) cannot have dynamic type Validator (missing Error method) 

Nhưng Validator struct có phương pháp Error.

Trả lời

8

Bạn có hai loại khác nhau, Validator và loại con trỏ *Validator và hai loại này có các bộ phương pháp khác nhau.

Bạn chỉ xác định phương thức Error() cho con trỏ trong khi Validator không có phương pháp này.

Những gì bạn có thể làm là thay đổi sau đây:

// Error implements error interface 
func (v Validator) Error() string { 
    return "" 
} 

...

case *Validator, Validator: // You are actually getting a *Validator 

này thực hiện Error() cho cả Validator*Validator. Khi Go specification nói:

Tập phương pháp của bất kỳ loại T khác bao gồm tất cả các phương pháp khai báo với kiểu thu T. Phương pháp tập hợp các kiểu con trỏ tương ứng * T là tập hợp của tất cả các phương pháp khai báo với bộ thu * T hoặc T (nghĩa là nó cũng chứa tập hợp phương thức T)

+0

Bạn có lời khuyên nào về khi để xác định một phương thức trên một con trỏ đến đối tượng hoặc đối tượng bản thân ? – warvariuc

+1

Xác định phương thức trên con trỏ khi 1. bạn cần sửa đổi đối tượng. 2. đó là một đối tượng lớn và sao chép nó là tốn kém. – OneOfOne

+0

Trong trường hợp này Validator có kích thước bằng 0, vì vậy tốt hơn nên sử dụng nó hơn một con trỏ. –

1

Trình biên dịch là chính xác. Validator loại không thực hiện Error, *Validator. Validator*Validator là các loại khác nhau. Chỉ cần thay thế cựu với thứ hai trong các loại công tắc:

switch test().(type) { 
case nil: 
    println("No error") 
case *Validator: 
    println("Validation error") 
    return 
default: 
    println("Unknown error") 
    return 
} 

dụ làm việc on the Go Playground: http://play.golang.org/p/aWqzPXweiA

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