我有以下代碼:
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) 錯誤。
我還嘗試將該型別約束提取到介面。我究竟做錯了什么?
更新:
接受@kraylog 的建議,我用這個解決了它:
func initialiseGrid[T int | bool](size int, fn func(i, j, size int) T) [][]T {
var tempGrid [][]T
for i := 0; i <= size 1; i {
for j := 0; j <= size 1; j {
tempGrid[i][j] = fn(i, j, size)
}
}
return tempGrid
}
// In some function body:
grid := initialiseGrid(n, func(i, j, size int) int {
if i == 0 || i == size 1 || j == 0 || j == size 1 {
return -1
} else {
return int(math.Floor(rand.Float64() * 6))
}
})
flooded := initialiseGrid(n, func(i, j, size int) bool { return false })
uj5u.com熱心網友回復:
泛型是編譯器為您提供的一種快捷方式,用于為不同型別創建同一函式的多個實體。
讓我們嘗試手動完成編譯器的作業。您將獲得這兩個函式 - 一個用于 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,而在第二個函式中則相反。
要解決問題,您需要使用T您正在處理的型別。這也解決了將布爾標志傳遞給函式的代碼味道:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447712.html
