第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

去泛型 - 工會

去泛型 - 工會

Go
墨色風雨 2022-10-10 17:58:06
我正在通過修改我為使用切片創(chuàng)建的庫來玩轉(zhuǎn)泛型。我有一個Difference函數(shù),它接受切片并返回僅在其中一個切片中找到的唯一元素列表。我修改了函數(shù)以使用泛型,并且我正在嘗試使用不同類型(例如字符串和整數(shù))編寫單元測試,但在聯(lián)合類型方面遇到了問題。這是我現(xiàn)在所擁有的:type testDifferenceInput[T comparable] [][]Ttype testDifferenceOutput[T comparable] []Ttype testDifference[T comparable] struct {    input testDifferenceInput[T]    output testDifferenceOutput[T]}func TestDifference(t *testing.T) {        for i, tt := range []testDifference[int] {            testDifference[int]{                input: testDifferenceInput[int]{                    []int{1, 2, 3, 3, 4},                    []int{1, 2, 5},                    []int{1, 3, 6},                },                output: []int{4, 5, 6},            },        } {            t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {                actual := Difference(tt.input...)                if !isEqual(actual, tt.output) {                    t.Errorf("expected: %v %T, received: %v %T", tt.output, tt.output, actual, actual)                }        })    }}我希望能夠在同一個表測試中同時測試 int 或 string。這是我嘗試過的:type intOrString interface {    int | string}type testDifferenceInput[T comparable] [][]Ttype testDifferenceOutput[T comparable] []Ttype testDifference[T comparable] struct {    input testDifferenceInput[T]    output testDifferenceOutput[T]}func TestDifference(t *testing.T) {        for i, tt := range []testDifference[intOrString] {            testDifference[int]{                input: testDifferenceInput[int]{                    []int{1, 2, 3, 3, 4},                    []int{1, 2, 5},                    []int{1, 3, 6},                },                output: []int{4, 5, 6},            },            testDifference[string]{                input: testDifferenceInput[string]{                    []string{"1", "2", "3", "3", "4"},                    []string{"1", "2", "5"},                    []string{"1", "3", "6"},                },                output: []string{"4", "5", "6"},            },        } 
查看完整描述

2 回答

?
茅侃侃

TA貢獻1842條經(jīng)驗 獲得超22個贊

如果您因為它的通用標題(不是雙關(guān)語)而遇到這個問答,這里有一個關(guān)于工會的快速入門:

  1. 可用于指定接口約束的類型集。泛型類型參數(shù)T將被限制為聯(lián)合中的類型

  2. 只能在接口約束中使用。如果一個接口包含一個聯(lián)合(帶有一個或多個術(shù)語),那么它就是一個接口約束。

  3. 可以包括近似元素~

例如:

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ù)列表中使用它。下面我替換comparableintOrString

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上允許的操作是什么?簡而言之:intstring

  • 變量聲明 ( 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

}


查看完整回答
反對 回復 2022-10-10
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

我已經(jīng)通過gotip傳遞了您的代碼,該代碼使用了更完善的提案實現(xiàn),并且它沒有抱怨該部分代碼,所以我認為問題出在 go2go 初始實現(xiàn)上。

請注意,您的實現(xiàn)將不起作用,因為您絕對可以在類型斷言表達式中使用參數(shù)接口,但是您不能像在testDifference[intOrString]


查看完整回答
反對 回復 2022-10-10
  • 2 回答
  • 0 關(guān)注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號