2014-07-06 29 views
6

,該程序不能編譯:不可能類型開關殼體

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

錯誤是:

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

但是Validator結構有方法Error

回答

8

您有兩種不同的類型,Validator和指針類型*Validator,並且這兩種類型具有不同的方法集。

您只定義了指針的Error()方法,而Validator沒有此方法。

你可以做的是以下變化:

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

...

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

這實現Error()兩個Validator*Validator。作爲Go specification說:

任何其他類型T的方法集包括與接收器類型T. 設置相應的指針類型* T的方法聲明的所有方法是一套具有聲明的所有方法(即它也包含T的方法集)

+0

你有沒有關於何時上的指針定義一個方法的任何意見,對象或對象本身? – warvariuc

+1

當你需要修改對象時,在指針上定義方法。 2.這是一個大對象,複製它很昂貴。 – OneOfOne

+0

在這種情況下,Validator的大小爲0,所以使用它比指針更好。 –

1

編譯器是正確的。 Validator類型不執行Error,*Validator呢。 Validator*Validator是不同的類型。只是在類型開關後者取代前者:

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

工作轉到遊樂場例如:http://play.golang.org/p/aWqzPXweiA