具有类型约束的 Go 泛型:不能在赋值中使用 false(无类型布尔常量)作为 T 值

我有以下代码:


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 assignment

cannot 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) 错误。


我也试过将该类型约束提取到接口中。我究竟做错了什么?


白衣染霜花
浏览 194回答 1
1回答

哆啦的时光机

泛型是编译器为不同类型创建同一函数的多个实例的快捷方式。让我们尝试手动完成编译器的工作。您将获得这两个函数 - 一个用于 int:func createGridInt(size int, forFlooded bool) [][]int {&nbsp; &nbsp; var tempGrid [][]int&nbsp; &nbsp; for i := 0; i <= size+1; i++ {&nbsp; &nbsp; &nbsp; &nbsp; for j := 0; j <= size+1; j++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if forFlooded {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempGrid[i][j] = false&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempGrid[i][j] = -1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return tempGrid}一个用于布尔:func createGridBool(size int, forFlooded bool) [][]bool {&nbsp; &nbsp; var tempGrid [][]bool&nbsp; &nbsp; for i := 0; i <= size+1; i++ {&nbsp; &nbsp; &nbsp; &nbsp; for j := 0; j <= size+1; j++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if forFlooded {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempGrid[i][j] = false&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempGrid[i][j] = -1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return tempGrid}突然间,这不再有意义了,因为您不能在第一个函数中分配false给intas,而在第二个函数中则相反。要解决这个问题,您需要使用Tas 您正在处理的类型。这也解决了将布尔标志传递给函数的代码味道:func createGrid[T int | bool](size int, fillWith T) [][]T {&nbsp; &nbsp; var tempGrid [][]T&nbsp; &nbsp; for i := 0; i <= size+1; i++ {&nbsp; &nbsp; &nbsp; &nbsp; for j := 0; j <= size+1; j++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tempGrid[i][j] = fillWith&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return tempGrid}你可以这样称呼它:createGrid(n, false)createGrid(n, -1)
打开App,查看更多内容
随时随地看视频慕课网APP