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

9 回复

首先你这也不是 map 呀

可以用 interface,不过不要用空 interface

更多关于Golang Go语言中如何在 map 的同一个 key 放不同的 struct?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


ToSt 改成 interface 不就可以么

&A{}即可。
因为 A 没有实现接口,*A 实现了。

map[string]interface{}

三楼正解

3 楼没毛病,因为你 A, B 都是用指针对象实现的接口

package main

type A struct {

}

type B struct {

}

type Te interface{
Tes()
}

type Tasks struct {
Name string
ToSt Te
}

func (s *A) Tes() {

}

func (s *B) Tes() {
}

func TT() {
var test A
var1 := Tasks{Name: “s”, ToSt: &test}
}

3 楼正解

在 Go 语言中,map 的值类型必须是固定的,这意味着你不能直接将不同的结构体类型(struct)赋值给同一个 key。然而,有几种方法可以间接实现这一需求:

  1. 使用接口(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 类型
    }
    
  2. 使用空接口和类型标签: 为了更清晰地管理不同类型的值,你可以在存储时附带一个类型标签。这样,在取出值时,你可以先检查类型标签,再进行类型断言。

  3. 使用泛型(Go 1.18+): 虽然泛型不能直接解决存储不同类型结构体的问题,但你可以设计一些泛型数据结构或方法来处理相关逻辑,不过这通常用于更复杂的场景,并不直接适用于此问题。

通常,推荐使用第一种方法(使用 interface{}),因为它简单且灵活。不过,使用时需要注意类型安全,避免类型断言错误。

回到顶部