为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中定义动态“类型结构”?

如何在golang中定义动态“类型结构”?

Go
慕神8447489 2022-01-04 10:03:29
这是游乐场链接https://play.golang.org/p/qMKxqrOcc2。问题类似于 Playground 上的问题。假设我有一个条件并且需要这样做:if modelName == "a"{    model = models.A} else{    model = models.B}在那里A和B一些型号:type A struct{    filed1 string    field2 string    //etc}和模型B是type B struct{    filed1 string    field2 string    //etc}中的字段A和B具有一些相同的字段,但它们主要反映数据库表(文档)并且它们具有相同的类型(类型结构)。当我在这一切面前说:var model interface{}我有错误:type models.A is not an expression 如果您问为什么,我这样做是为了避免代码中的代码冗余。问题与此类似:如何在 Golang 中返回动态类型结构?
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

您不能分配类型。您必须分配实例。您的代码实际上必须如下所示。我在您要更改的两行中添加了注释。


package main


import "fmt"


type B struct {

    filed1 string

    field2 string

    //etc


}


type A struct {

    filed1 string

    field2 string

    //etc


}


func main() {

    var model interface{}

    modelName := "b"

    if modelName == "a" {

        model = A{} // note the {} here

    } else {

        model = B{} // same here

    }


    fmt.Println(model)

}

只是一个忠告,您可能不想使用泛型interface{}类型,而最好使用同时实现A和的实际接口B。泛型接口类型会让你更头疼,并且真的违背了使用像 Go 这样的静态类型语言的目的。


查看完整回答
反对 回复 2022-01-04
?
POPMUISE

TA贡献1765条经验 获得超5个赞

您收到错误是因为您试图为interface{}实例分配类型。您需要分配一个实例。


如果你有;


var model interafce{}


if modelName == "a"{

    model = models.A{}

else{

    model = models.B{}

}

那么它会工作正常。


查看完整回答
反对 回复 2022-01-04
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这是带有接口类型实现的编辑程序:


package main


import (

    "log"

)


//// Interfaces ////

type PhotoManager interface {

    AddPhotos(id string) (bool, error)

}


//// Post ////

type Post struct {

    Photos []string

}


func (p *Post) AddPhotos(id string) (bool, error) {

    p.Photos = append(p.Photos, id)

    return true, nil

}


//// Product ////

type Product struct {

    Photos []string

    Docs   []string

}


func (p *Product) AddPhotos(id string) (bool, error) {

    p.Photos = append(p.Photos, id)

    return true, nil

}


// Useless function to demonstrate interface usage //

func AddPhotoToInterfaceImplementation(id string, pm PhotoManager) {

    pm.AddPhotos(id)

}


//// Main ////

func main() {

    post := Post{}

    product := Product{}

    post.AddPhotos("123")

    product.AddPhotos("321")

    AddPhotoToInterfaceImplementation("456", &post)

    AddPhotoToInterfaceImplementation("654", &product)

    log.Println(post)

    log.Println(product)

}

这里的活动部分是:


PhotoManager interface用于定义具有泛型函数的接口的类型

AddPhotoson的实现Post并Product提供接口函数的实际实现

使用pm PhotoManageras 参数来AddPhotoToInterfaceImplementation显示接口类型的用法。


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信