3 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
有沒有辦法將允許的類型減少到 [空接口] 的特定類型列表?
在編譯時(shí),沒有。
但是,您可以選擇在運(yùn)行時(shí)使用限制。當(dāng)有其他選擇時(shí),應(yīng)該避免這種情況,因?yàn)樗荒芴峁┳銐虻陌踩浴?/p>
這是在標(biāo)準(zhǔn)庫中的許多地方完成的,例如 json marshaler,它需要一個(gè)指針作為目標(biāo)。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
您不能在編譯時(shí)以您想要的方式強(qiáng)制使用一組具體類型。
您可以做的是使用接口。列出您期望從實(shí)現(xiàn)中獲得的接口中的方法。那么具體的運(yùn)行時(shí)類型是什么就無關(guān)緊要了。您僅通過接口與值交互,這在編譯時(shí)保證它是由傳遞的值實(shí)現(xiàn)的。
例如,如果您希望該值提供一個(gè)int32值,請使用此接口:
type HasInt32 interface {
Int32() int32
}
func f(i HasInt32) {
fmt.Println("int32 value:", i.Int32())
}
int32傳遞的值是否具有或float64作為其基礎(chǔ)類型,或者它是任何其他復(fù)雜類型都無關(guān)緊要。你需要一個(gè)int32,這就是你得到的。實(shí)現(xiàn)者負(fù)責(zé)如何產(chǎn)生該值。
例如:
type MyInt32 int32
func (m MyInt32) Int32() int32 { return int32(m) }
type MyStruct struct {
i int64
}
func (m MyStruct) Int32() int32 { return int32(m.i) }
測試它:
var m MyInt32 = 1
f(m)
var s MyStruct = MyStruct{i: 2}
f(s)
哪些輸出(在Go Playground上嘗試):
int32 value: 1
int32 value: 2

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
有沒有辦法將允許的類型減少到特定的類型列表?
是的,從 Go 1.18 開始,使用帶有類型元素的接口。但是這樣的接口只能作為類型參數(shù)的約束。在規(guī)范的草案版本中,接口類型下提到了這一點(diǎn):
包含非接口類型、~T 形式的術(shù)語或聯(lián)合的接口只能用作類型約束,或用作用作約束的其他接口的元素。它們不能是值或變量的類型,也不能是其他非接口類型的組件。
簡而言之,在接口中,除了方法簽名和其他嵌入式接口之外,您現(xiàn)在可以添加類型元素。這定義了一個(gè)類型約束,即“相應(yīng)類型參數(shù)的允許類型參數(shù)集”。
尤其:
接口約束可以指定一個(gè)或多個(gè)類型元素。它將類型參數(shù)限制為指定的類型。您可以將多個(gè)類型元素指定為聯(lián)合(更多信息:Go Generics - Unions)
type MyNumber interface {
float32 | float64 | uint | int
}
您可以使用標(biāo)記~來指定近似元素,即基礎(chǔ)類型為的所有類型的集合T(更多信息:Go 中新標(biāo)記?的含義是什么(近似元素)?)。這些也可以是工會的一部分。
type MyNumber interface {
~float32 | ~float64 | ~uint | ~int
}
您仍然可以在這樣的接口中指定方法簽名。它將類型參數(shù)限制為也實(shí)現(xiàn)接口的那些類型的集合:
// set of types with underlying int that also implement `String() string`
type MyNumber interface {
~int
String() string
}
作為上述推論,如果接口指定了非近似的預(yù)聲明類型和方法,則沒有類型會滿足接口(因?yàn)槟荒茉陬A(yù)聲明類型上聲明方法)
// empty type set
type MyNumber interface {
int
String() string
}
如前所述,您僅將其用作類型參數(shù)約束,您將無法在類型切換、聲明變量等中使用它:
func foo[T MyNumber](v T) {
// ...
}
- 3 回答
- 0 關(guān)注
- 212 瀏覽
添加回答
舉報(bào)