我有两个具有一些相同字段名称和类型的结构:
type JOURNAL_TAG struct {
DATE_START time.Time
DATE_END time.Time
ENTRY_NUMBER uint
VALUE float64
}
type INVENTORY_TAG struct {
DATE_START time.Time
DATE_END time.Time
PRICE float64
QUANTITY float64
ACCOUNT_NAME string
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数可以访问公共字段DATE_START,该字段应该对这些类型的切片进行排序:
func sort_by_time[t JOURNAL_TAG|INVENTORY_TAG](slice []t, is_ascending bool) {
sort.Slice(slice, func(i, j int) bool {
return slice[i].DATE_START.After(slice[j].DATE_START) == is_ascending
})
}
Run Code Online (Sandbox Code Playgroud)
运行go build报编译错误:
slice[i].DATE_START undefined (type t has no field or method DATE_START)
Run Code Online (Sandbox Code Playgroud)
我想使用泛型对这两种类型的切片进行排序,可以吗?
我正在使用 go 1.18。
我试图在 Go 中定义一个通用函数,它接受具有某些字段的值,例如ID int. 我尝试了几种方法,但似乎都不起作用。这是我尝试过的一个例子。
package main
import (
"fmt"
)
func Print[T IDer](s T) {
fmt.Print(s.ID)
}
func main() {
Print(Person{3, "Test"})
}
type IDer interface {
~struct{ ID int }
}
type Person struct {
ID int
Name string
}
type Store struct {
ID int
Domain string
}
Run Code Online (Sandbox Code Playgroud)
这是游乐场链接:https ://gotipplay.golang.org/p/2I4RsUCwagF
在上面的示例中,我想保证传递给Print函数的每个值都有一个属性ID int,该属性也可以在函数中访问。有什么方法可以在 Go 中实现此目的,而无需在接口中定义方法(例如GetID() int)?
我想编写一个函数,可以将某些字段添加到 Firebase 消息结构中。有两种不同类型的消息Message和MulticastMessage,它们都包含相同类型的Android和APNS字段,但消息类型之间没有显式声明的关系。
我想我应该能够做到这一点:
type firebaseMessage interface {
*messaging.Message | *messaging.MulticastMessage
}
func highPriority[T firebaseMessage](message T) T {
message.Android = &messaging.AndroidConfig{...}
....
return message
}
Run Code Online (Sandbox Code Playgroud)
但它给出了错误message.Android undefined (type T has no field or method Android)。我也不会写switch m := message.(type)( cannot use type switch on type parameter value message (variable of type T constrained by firebaseMessage))。
我可以写switch m := any(message).(type),但我仍然不确定这是否能达到我想要的效果。
我发现了一些对联合和类型约束感到困惑的人提出的其他问题,但我看不到任何有助于解释为什么这不起作用的答案(也许是因为我试图将它与结构而不是接口一起使用?)或者联合类型约束实际上有什么用处。