Golang Go语言中如何在 map 的同一个 key 放不同的 struct?
Golang Go语言中如何在 map 的同一个 key 放不同的 struct?
package learn
type A struct {
}
type B struct {
}
type Tasks struct {
Name string
ToSt Te
}
type Te interface{
Tes()
}
func (s *A)Tes() {
}
func (s *B)Tes() {
}
func TT() {
var1 := Tasks{Name: “s”, ToSt: A{}}
}
- 想让 Task 的 ToSt 指向 A 或者 B 的一个 struct 。想这么做,但是很明显不行。
更多关于Golang Go语言中如何在 map 的同一个 key 放不同的 struct?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
ToSt 改成 interface 不就可以么
&A{}即可。
因为 A 没有实现接口,*A 实现了。
map[string]interface{}
三楼正解
3 楼没毛病,因为你 A, B 都是用指针对象实现的接口
3 楼正解
在 Go 语言中,map
的值类型必须是固定的,这意味着你不能直接将不同的结构体类型(struct
)赋值给同一个 key
。然而,有几种方法可以间接实现这一需求:
-
使用接口(
interface{}
): 你可以将map
的值类型定义为interface{}
,这样你就可以存储任何类型的值,包括不同的结构体。但是,在取出值时,你需要进行类型断言来恢复原始类型。var myMap map[string]interface{} = make(map[string]interface{}) myMap["key"] = SomeStruct1{} myMap["key"] = AnotherStruct2{} // 取值时 if val, ok := myMap["key"].(SomeStruct1); ok { // 处理 SomeStruct1 类型 } else if val, ok := myMap["key"].(AnotherStruct2); ok { // 处理 AnotherStruct2 类型 }
-
使用空接口和类型标签: 为了更清晰地管理不同类型的值,你可以在存储时附带一个类型标签。这样,在取出值时,你可以先检查类型标签,再进行类型断言。
-
使用泛型(Go 1.18+): 虽然泛型不能直接解决存储不同类型结构体的问题,但你可以设计一些泛型数据结构或方法来处理相关逻辑,不过这通常用于更复杂的场景,并不直接适用于此问题。
通常,推荐使用第一种方法(使用 interface{}
),因为它简单且灵活。不过,使用时需要注意类型安全,避免类型断言错误。