为了账号安全,请及时绑定邮箱和手机立即绑定

具有类型约束的 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 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) 错误。


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


查看完整描述

1 回答

?
哆啦的时光机

TA贡献1514条经验 获得超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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信