2013-05-08 33 views
6

我是golang的新手,很抱歉,如果這個問題太天真了。環顧四周,但找不到我的基本問題的答案。在混凝土結構上輸入cast和type assertion?

可以說我有一個具體的結構和方法,如下所示。

type MyData struct{ 
    field1 string 
    field2 int 
    } 

func(a MyData) OperatorOnString() string{ 
    return a.field1.(string) 
} 

func(a MyData) OperatorOnInt() int{ 
    return a.field2.(int) 
} 

我的問題是,我可以輸入並返回而不是執行斷言?從我迄今所學到的是,斷言用於類型接口的數據。但在這種情況下,我有具體的類型。我是否仍然使用斷言,或者我可以執行類似return int(a.field2)的操作。我知道這個例子是微不足道的,但我很困惑的一點是在兩種轉換類型之間使用。或者這裏涉及到一些golang慣用性?

由於

回答

9

首先type assertion只能在接口中使用:

對於接口類型的表達式x和類型T,初級表達

x.(T) 

斷言x不是零,並且存儲在x中的值是T類型。符號x.(T)被稱爲類型斷言。

但是你把它應用到非接口類型的字段(intstring)。這使編譯器unhappy。其次,如果您想從方法/函數返回類型T,返回您的字段已經發生的T類型的表達式就足夠了。正確的代碼是那麼容易:

package main 

import "fmt" 

type MyData struct { 
     field1 string 
     field2 int 
} 

func (a MyData) OperatorOnString() string { 
     return a.field1 
} 

func (a MyData) OperatorOnInt() int { 
     return a.field2 
} 

func main() { 
     a := MyData{"foo", 42} 
     fmt.Println(a.OperatorOnString(), a.OperatorOnInt()) 
} 

Playground


輸出:

foo 42 
+0

感謝。然而,在實際情況下,我的操作員將有一些參數用於在MyData字段上操作。因此,在返回該字段之前,是否需要檢查類型? – Minty 2013-05-08 13:50:49

+0

@Minty:顯示真實的代碼。很可能你在混合幾個概念,如果沒有真正的代碼,它不會變得更好。 – Volker 2013-05-08 14:10:57

+1

@Minty:如果一個fn返回類型「T」,那麼只有'T'類型的表達式可以出現在'return expr'中。這不是關於領域,而是關於表達的類型。例如。如果我們在返回'int64'的fn中有'var i int',那麼我們可以並且必須寫'return int64(i)'。廣告「檢查類型」:類型檢查由編譯器自動完成。 – zzzz 2013-05-08 14:11:38