這個問題在這里已經有了答案: 如何使用泛型訪問結構欄位(型別 T 沒有欄位或方法)? (1 個回答) 昨天關門。
有兩種結構型別,Foo和Bar,帶有int資料成員val。我正在嘗試撰寫一個可以處理這兩種型別的通用函式。我嘗試了以下方法,但沒有奏效。
package main
import "fmt"
type Foo struct {
val int
}
type Bar struct {
val int
}
func Add[T any](slice []T) int {
var sum int
for _, elem := range slice {
sum = elem.val
}
return sum
}
func Test() {
f1 := Foo{val: 2}
f2 := Foo{val: 2}
fslice := []Foo{f1, f2}
fsum := Add(fslice)
fmt.Printf("fsum = %d\n", fsum)
b1 := Bar{val: 3}
b2 := Bar{val: 3}
bslice := []Bar{b1, b2}
bsum := Add(bslice)
fmt.Printf("bsum = %d\n", bsum)
}
func main() {
Test()
}
編譯器拋出以下錯誤。
$ go run generics1.go
# command-line-arguments
./generics1.go:16:15: elem.val undefined (type T has no field or method val)
去游樂場鏈接:https ://go.dev/play/p/mdOMH3xuwu7
有什么可能的方法來解決這個問題?
uj5u.com熱心網友回復:
根據golang 1.18 發行說明
Go 編譯器不支持訪問結構欄位 xf,其中 x 是型別引數型別,即使型別引數的型別集中的所有型別都具有欄位 f。我們可能會在未來的版本中洗掉此限制。
您可以定義一個GetVal()介面方法來檢索val,并將此方法用作泛型型別約束的一部分。
示例代碼
type Foo struct {
val int
}
func (f Foo) GetVal() int {
return f.val
}
type Bar struct {
val int
}
func (b Bar) GetVal() int {
return b.val
}
type MyType interface {
Foo | Bar
GetVal() int
}
func Add[T MyType](slice []T) int {
var sum int
for _, elem := range slice {
sum = elem.GetVal()
}
return sum
}
https://go.dev/play/p/0eJZpqy7q8f
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530638.html
標籤:去仿制药
上一篇:Java中相同超類的2個類的介面
下一篇:不是介面型別的泛型型別
