gpt4 book ai didi

syntax - golang 中的对象工厂

转载 作者:IT王子 更新时间:2023-10-29 01:22:32 25 4
gpt4 key购买 nike

我是 golang 新手。我需要设计一个函数来根据输入创建不同类型的对象。但是我没弄清楚如何设计界面。这是我的代码:

package main

import (
"fmt"
)

type AA struct{
name string
}

func (this *AA) say(){
fmt.Println("==========>AA")
}
type BB struct{
*AA
age int
}
func (this *BB) say(){
fmt.Println("==========>BB")
}

func ObjectFactory(type int) *AA {
if type ==1 {
return new(AA)
}else{
return new(BB)
}
}

func main() {
obj1 := ObjectFactory(0)
obj1.say()
obj2 := ObjectFactory(0)
obj2.say()
}

无论我要求 ObjectFactory 返回 *AA 还是 interface{},编译器都会告诉我错误。我怎样才能让它发挥作用?

最佳答案

首先,在 go 中不允许使用 type 作为变量名(参见 spec)。那是你的第一个问题。

对象工厂的返回类型是*AA。也就是说它只能返回*AA类型的变量,导致BB类型的返回失败。正如规范中所定义的,go 没有类型继承,只有结构嵌入。

如果您创建一个名为 sayer 的接口(interface),则可以在您的 ObjectFactory 函数中使用它代替 *AA。

type sayer interface {
say()
}

您可能希望在尝试进行多重分派(dispatch)时使用此接口(interface)(如下面的代码所示(另请参阅 on play.golang.org)。

试试这段代码:

package main

import (
"fmt"
)

type sayer interface {
say()
}

type AA struct{
name string
}

func (this *AA) say(){
fmt.Println("==========>AA")
}
type BB struct{
*AA
age int
}
func (this *BB) say(){
fmt.Println("==========>BB")
}

func ObjectFactory(typeNum int) sayer {
if typeNum ==1 {
return new(AA)
}else{
return new(BB)
}
}

func main() {
obj1 := ObjectFactory(1)
obj1.say()
obj2 := ObjectFactory(0)
obj2.say()
}

关于syntax - golang 中的对象工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19994775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com