亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

具有類型約束的 Go 泛型:不能在賦值中使用 false(無類型布爾常量)作為 T 值

具有類型約束的 Go 泛型:不能在賦值中使用 false(無類型布爾常量)作為 T 值

Go
白衣染霜花 2022-11-23 19:50:21
我有以下代碼:func createGrid[T int | bool](size int, forFlooded bool) [][]T {    var tempGrid [][]T    for i := 0; i <= size+1; i++ {        for j := 0; j <= size+1; j++ {            if forFlooded {                tempGrid[i][j] = false            } else {                tempGrid[i][j] = -1            }        }    }    return tempGrid}我在分配的行中收到以下錯誤tempGrid[i][j]:cannot use false (untyped bool constant) as T value in assignmentcannot use -1 (untyped int constant) as T value in assignment這就是我使用它的方式:var grid [][]int;grid = createGrid(n, false);var flooded [][]bool;flooded = createGrid(n, true);在這里,我得到CannotInferTypeArgs( cannot infer T) 錯誤。我也試過將該類型約束提取到接口中。我究竟做錯了什么?
查看完整描述

1 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

泛型是編譯器為不同類型創建同一函數的多個實例的快捷方式。


讓我們嘗試手動完成編譯器的工作。您將獲得這兩個函數 - 一個用于 int:


func createGridInt(size int, forFlooded bool) [][]int {

    var tempGrid [][]int


    for i := 0; i <= size+1; i++ {

        for j := 0; j <= size+1; j++ {

            if forFlooded {

                tempGrid[i][j] = false

            } else {

                tempGrid[i][j] = -1

            }

        }

    }

    return tempGrid

}

一個用于布爾:


func createGridBool(size int, forFlooded bool) [][]bool {

    var tempGrid [][]bool


    for i := 0; i <= size+1; i++ {

        for j := 0; j <= size+1; j++ {

            if forFlooded {

                tempGrid[i][j] = false

            } else {

                tempGrid[i][j] = -1

            }

        }

    }

    return tempGrid

}

突然間,這不再有意義了,因為您不能在第一個函數中分配false給intas,而在第二個函數中則相反。


要解決這個問題,您需要使用Tas 您正在處理的類型。這也解決了將布爾標志傳遞給函數的代碼味道:


func createGrid[T int | bool](size int, fillWith T) [][]T {

    var tempGrid [][]T


    for i := 0; i <= size+1; i++ {

        for j := 0; j <= size+1; j++ {

            tempGrid[i][j] = fillWith

        }

    }

    return tempGrid

}

你可以這樣稱呼它:


createGrid(n, false)

createGrid(n, -1)


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 309 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號