大佬们求问GO,返回值问题

小草
  • 94

求问大佬,函数Object的返回值,如何定义,才能在调用的时候

type A struct {
}

type B struct {
}

func Object(id int) (g *struct{}) {
    if id == 1 {
        return A
    }

    if id == 2 {
        return B
    }
}

Object(1) //想是 A类型
Object(2) //想是 B类型

interface{} 会改变类型,不想改变类型,可以做到吗
回复
阅读 587
4 个回答

不用 interface 做不到

一个将就的方法是 func f() (*A, *B)

如果不用interface{}的话,可以更抽象一层为接口。属性可以通过方法暴露出来。

静态语言就不要尝试用动态的方式去写代码。反正就是合理的取舍就行了。如果你这个是工具函数,那么用了interface调用者还需断言才能使用,更加麻烦,但是如果你这个是类似于json输出的函数,那么interface就很适合。作为工具函数,要么就是写多个入口函数,比如:SortInt8,SortInt32 这种,要么就是结构体合并AB的字段。

想用GO实现简单工厂模式,方法还是有的,定义一个接口,两个结构体实现这个接口,返回时返回接口类型

package main

import (
    "fmt"
    "reflect"
)

type A struct {

}

type B struct {

}

type Whatever interface {
    whatever()
}

func (a A) whatever() {

}

func (b B) whatever() {

}

func Object(id int) Whatever  {
    if id == 1 {
        return &A{}
    }

    if id == 2 {
        return &B{}
    }

    return &A{}
}

func main() {
    a := Object(1).(*A)

    fmt.Println(reflect.TypeOf(a))

    b := Object(2).(*B)

    fmt.Println(reflect.TypeOf(b))

}
你知道吗?

宣传栏