Go语言 如何限制特定类型的接口{}

bybem2ql  于 2023-04-18  发布在  Go
关注(0)|答案(2)|浏览(112)

我正在使用Go语言,我有一个工厂函数,它根据请求的标识符返回不同类型的对象:

func NewObject(id string) interface{} {
    switch id {
    case "truck":
        return Truck{}
    case "car":
        return Car{}
    ....
    }
}

以下是相应的结构类型:

type Truck struct {
    Foo string
}

type Car struct {
    Bar string
}

正如你所看到的,Truck和Car没有任何共同之处。问题的根源在于,当调用NewObject(..)时,我现在必须处理太宽的类型interface{}。我知道有泛型,但这需要在类型约束中保留所有支持的类型的列表,这会使代码库中的事情变得复杂。
基本上,我在这里寻找一种方法来使用继承,当然Go语言不支持继承。有什么替代方法吗?

mi7gmzs6

mi7gmzs61#

NewObject(..)函数可以在泛型的支持下实现,不需要在类型约束中列出所有支持的类型。

func NewObject[T any](id string) T {
 var vehicle any

 switch id {

 case "truck":
  vehicle = Truck{
   Foo: "foo",
  }
 case "car":
  vehicle = Car{
   Bar: "bar",
  }
 }

 if val, ok := vehicle.(T); ok {
  return val
 }

 var otherVehicle T
 fmt.Printf("Not implemented. Returning with default values for \"%v\"\n", id)
 return otherVehicle
}

您可以看到完整的示例here

j0pj023g

j0pj023g2#

我有个奇怪的例子
此示例将返回construct of struct
希望这能激励你

package main

import (
    "fmt"
)

type testA struct {
    a uint
}
type testB struct {
    b string
}

var mp map[string]func(...interface{}) interface{} = map[string]func(...interface{}) interface{}{
    "struct1": func(para ...interface{}) interface{} {
        return &testA{
            a: para[0].(uint),
        }
    },
    "struct2": func(para ...interface{}) interface{} {
        return &testB{
            b: para[0].(string),
        }
    },
}

func NewSpecial(type_check_str string) func(...interface{}) interface{} {
    if val, ok := mp[type_check_str]; ok {
        return val
    }
    return nil
}

func main() {

    test1 := NewSpecial("struct1")(uint(5))
    test2 := NewSpecial("struct2")("It's Ok?")
    fmt.Println(test1)
    fmt.Println(test2)
}

相关问题