猿问

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

这是游乐场链接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 中返回动态类型结构?


慕神8447489
浏览 196回答 3
3回答

料青山看我应如是

您不能分配类型。您必须分配实例。您的代码实际上必须如下所示。我在您要更改的两行中添加了注释。package mainimport "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 这样的静态类型语言的目的。

POPMUISE

您收到错误是因为您试图为interface{}实例分配类型。您需要分配一个实例。如果你有;var model interafce{}if modelName == "a"{    model = models.A{}} else{    model = models.B{}}那么它会工作正常。

慕哥6287543

这是带有接口类型实现的编辑程序:package mainimport (    "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显示接口类型的用法。
随时随地看视频慕课网APP

相关分类

Go
我要回答