2 回答

TA貢獻1842條經(jīng)驗 獲得超22個贊
如果您因為它的通用標題(不是雙關(guān)語)而遇到這個問答,這里有一個關(guān)于工會的快速入門:
可用于指定接口約束的類型集。泛型類型參數(shù)
T
將被限制為聯(lián)合中的類型只能在接口約束中使用。如果一個接口包含一個聯(lián)合(帶有一個或多個術(shù)語),那么它就是一個接口約束。
可以包括近似元素
~
例如:
type intOrString interface {
int | string
}
func Foo[T intOrString](x T) {
// x can be int or string
}
現(xiàn)在談談OP的問題,還有更多細節(jié):
您不能將接口約束用作類型
通過包含類型集,intOrString
成為接口約束,并且明確不支持將其用作類型。允許約束作為普通接口類型:
這是我們現(xiàn)在不建議的功能,但可以考慮用于該語言的更高版本。
所以首先要做的是intOrString
用作實際約束,因此在類型參數(shù)列表中使用它。下面我替換comparable
為intOrString
:
type testDifferenceInput[T intOrString] [][]T
type testDifferenceOutput[T intOrString] []T
type testDifference[T intOrString] struct {
input testDifferenceInput[T]
output testDifferenceOutput[T]
}
這也意味著您不能使用約束將具體類型實例化為測試切片:
// bad: using intOrString to instantiate a parametrized type[]testDifference[intOrString]
通用容器不能容納不同類型的項目
您遇到的第二個問題是測試切片包含兩個不相關(guān)類型的結(jié)構(gòu)。一個是testDifference[int]
,一個是testDifference[string]
。即使類型testDifference
本身使用聯(lián)合約束進行參數(shù)化,它的具體實例也不是相同的類型。另請參閱此以獲取更多詳細信息。
如果您需要一個包含不同類型的切片,您唯一的選擇是[]interface{}
(或[]any
) ...或者,您只需將切片分開:
ttInts := []testDifference[int]{ testDifference[int]{...}, /* etc. */ } ttStrs := []testDifference[string]{ testDifference[string]{...}, /* etc. */ }
允許對聯(lián)合約束的操作
只有類型集中所有類型都支持的操作。基于類型集的操作:
規(guī)則是泛型函數(shù)可以以參數(shù)約束的類型集的每個成員所允許的任何方式使用其類型為類型參數(shù)的值。
如果有類似 的約束,在或int | string
上允許的操作是什么?簡而言之:int
string
變量聲明 (
var foo T
)轉(zhuǎn)換和斷言
T(x)
,并x.(T)
在適當?shù)臅r候比較 (
==
,!=
)排序 (
<
,<=
,>
和>=
)+
操作員
所以你可以有一個intOrString
約束,但使用它的功能,包括你的 func Difference
,僅限于這些操作。例如:
type intOrString interface {
int | string
}
func beforeIntOrString[T intOrString](a, b T) bool {
return a < b
}
func sumIntOrString[T intOrString](a, b T) T {
return a + b
}
func main() {
fmt.Println(beforeIntOrString("foo", "bar")) // false
fmt.Println(beforeIntOrString(4, 5)) // true
fmt.Println(sumIntOrString("foo", "bar")) // foobar
fmt.Println(sumIntOrString(10, 5)) // 15
}
- 2 回答
- 0 關(guān)注
- 102 瀏覽
添加回答
舉報