gpt4 book ai didi

dictionary - map[gorm.DB]struct{}{} 给出无效的映射键类型 gorm.DB

转载 作者:IT王子 更新时间:2023-10-29 01:57:32 31 4
gpt4 key购买 nike

我想创建一组在我的应用程序中使用的 gorm 类型。所以我想用我的类型定义一个 map gorm.DB作为键和空的结构{}作为标志:

var (
autoMigrations map[gorm.DB]struct{}
)

但是编译器不允许我这样做并出现错误:invalid map key type gorm.DB。我可以使用指向 gorm.DB 的指针来欺骗它,例如:

map[*gorm.DB]struct{}

但这不是解决方案,因为我需要使它独一无二,如果我的 map 像 db.AutoMigrate(&Chat{}) 一样填充,我可以获得许多具有不同地址的相似对象。

另一个解决方案是制作一片gorm.DB:

autoMigrations []gorm.DB

但我必须在添加时手动过滤元素,这看起来有点疯狂。

最佳答案

您只能将类型用作映射中的键 comparable . Spec: Map types:

The comparison operators == and != must be fully defined for operands of the key type; thus the key type must not be a function, map, or slice.

gorm.DB 是一个结构,只有当所有字段都可比较时,结构值才可比较:

Struct values are comparable if all their fields are comparable. Two struct values are equal if their corresponding non-blank fields are equal.

但是 gorm.DB 有例如一个 DB.values 字段,它是一个 map 类型, map 是不可比较的,因此 gorm.DB 值也不可比较,所以你不能使用它作为 map 键。

如果你想创建一组类型,你应该使用reflect.Type作为 map 键,您可以使用 reflect.TypeOf() 获取它们来自该类型的值。

一个小技巧,如果你想要一个 reflect.Type 而不必创建一个有问题的类型的值,你可以从那个类型的指针值开始(可能是 nil),并使用 Type.Elem() 获取指向类型的 reflect.Type 描述符。

例如,获取结构类型Point struct{ X, Y int }reflect.Type 描述符,而无需实际创建/拥有Point:

type Point struct{ X, Y int }
tpoint := reflect.TypeOf((*Point)(nil)).Elem()
fmt.Println(tpoint)

打印 main.Point。在 Go Playground 上试用.

查看相关问题:

How can I prevent a type being used as a map key?

Why can't Go slice be used as keys in Go maps pretty much the same way arrays can be used as keys?

Set of structs in Go

关于dictionary - map[gorm.DB]struct{}{} 给出无效的映射键类型 gorm.DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47175474/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com