注意:我正在將這個問題編輯為一個具體示例,說明我為什么要這樣做,這就是為什么某些答案在上下文中可能不再有意義的原因。我正在編寫一些代碼來傳遞來自輸入的數據。數據采用標簽的形式,這些標簽具有它們包含的數據類型的標識符,然后是數據。不幸的是,我無法控制輸入,并且事先不知道其中會有什么標簽,一個可能是一個整數,另一個可能是一個字符串,還有一個可能是一個整數數組。當我需要像處理相同類型的所有標簽時出現問題,例如,如果我有一片標簽,一個接受或返回標簽的函數。到目前為止,我所看到的解決方案是用一個空接口定義切片/函數,這將允許我這樣做,但這有點不受歡迎,因為它不會告訴其他使用該包的人關于預期的類型并且也有點違背了首先使用類型化語言的觀點。然而,接口似乎是這里的解決方案,我希望有一個Tag接口可以傳遞,這確實需要我在它們上面定義方法,但實際上它們不需要任何方法。我目前的解決方案是這樣的type Tag interface{ implementTag()}type TagInt intfunc (tag TagInt) implementTag() {}type TagString stringfunc (tag TagInt) implementTag() {}雖然這確實有效并解決了我的問題,但必須為此定義虛擬方法感覺非常錯誤。所以我的問題總結如下:有沒有什么方法可以定義某物是 a 而Tag不必定義虛擬方法?
3 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
在您的場景中,我會做的是接受參數中帶有空接口的任何類型,然后在內部使用類型斷言來確認它是您想要的類型。
if t1, ok := interfaceInput.(t1); !ok{
// handle it being the wrong type here
return
}
此外,如果您想要數據類型與其方法(即對象)之間的緊密耦合,那么將它作為對象的方法有什么問題呢?

UYOU
TA貢獻1878條經驗 獲得超4個贊
您可以使用[]interface{}
for “任何類型的切片”,但是您可以使用類型斷言和/或類型開關來發現該切片成員的實際運行時類型。
在Go 之旅中了解有關空接口的更多信息
現在想要制作一個可以同時容納 t1 和 t2 但沒有其他東西的切片。
這是一個非常不尋常的要求,您在 Go 中不太可能需要它。但是您也可以通過以下方式進行自己的受歧視聯合:
type item struct {
typeSelector int
t1Value t1
t2Value t2
}
然后使用[]item,typeSelector在運行時檢查以查看填充了哪個值。
或者,您甚至可以使用*t1and*t2和 havenil表示“此字段中沒有值”。
- 3 回答
- 0 關注
- 187 瀏覽
添加回答
舉報
0/150
提交
取消