我可以在 Golang 中创建一个类型的别名吗?
Posted
技术标签:
【中文标题】我可以在 Golang 中创建一个类型的别名吗?【英文标题】:Can I create an alias of a type in Golang? 【发布时间】:2017-02-26 11:00:28 【问题描述】:我正在努力学习围棋。
我在 go:gopkg.in/fatih/set.v0 中找到了一个 Set 的简洁实现,但我更喜欢用一个比 set.Set
更明确的名称来命名我的集合,例如:
type View set.Set
本质上,我希望我的View
类型继承set.Set
的方法。因为,View
是一个 set.Set
的描述符。但我知道 Go 在继承和一般打字方面非常出色。
目前我一直在尝试以下 有点 继承,但在尝试使用 func Union(set1, set2 Interface, sets ...Interface) Interface
或 func (s *Set) Merge(t Interface)
等函数时会导致大量错误:
type View struct
set.Set
我想知道是否有一种方法可以以类似 Go 的方式实现我想要的,或者我只是想将我的优秀 OO 实践应用到一种丢弃它们的语言上,拜托。
【问题讨论】:
不要尝试像带有继承的 OO 语言那样编写 Go。没有没有继承,所以你只会制造更多的混乱。如果您想自动委托方法和字段,您可以像在第二个示例中那样使用嵌入,这很好,但请记住,这只是一种组合形式。 那么,您的建议是使用原始 set.Set 类型吗?既然使用 set 的函数对嵌入类型来说太麻烦了?还不错,我只是在考虑自己在做什么之前直接潜入了继承。 如果你有兴趣,这里有一篇威廉肯尼迪关于这个主题的好文章:goinggo.net/2016/10/reducing-type-hierarchies.html @AdrienLuxey:是的,如果你想要的话,直接使用 set 类型。您必须展示一个嵌入问题的示例,因为它根本不会改变set.Set
的任何行为。
@thoeni 感谢您的教程,我正在学习它 :) 感谢 JimB 的精确度,我会照着说的做的!对于新手来说,围棋很费脑筋……我会成功的!
【参考方案1】:
注意,我认为您最初提出的简单别名在语法上是有效的,尽管快速查看了集合库,而不是别名 set.Set
,别名 set.Interface
可能更有意义,例如:
package main
import (
"fmt"
set "gopkg.in/fatih/set.v0"
)
// View is a type alias for the set.Interface interface
type View set.Interface
// Display takes one of our View types in order to print it.
func Display(view View)
fmt.Println(view.List())
func main()
// create our first set.Interface or View
v1 := set.New()
v1.Add("foo")
// create our second set.Interface or View
v2 := set.New("bar")
// call a set function
v3 := set.Union(v1, v2)
// call our function that takes a View
Display(v3)
您可能已经注意到我在作弊,因为我在上面的代码中没有真正提及别名类型,除了定义Display
函数的参数,您会注意到上面的View
实例而不是set.Interface
。如果您有很多功能在处理这些事情,那么这可能会更适合您的领域。
请注意,因为我们的 View
类型是接口类型的别名,所以它会阻止将您自己的函数添加到该类型,因为 Go 不允许我们为函数提供接口接收器类型(我可能是在表达错误)。我的意思是你不能做这样的事情:
func (v View) Display() string
return v.String()
总的来说,我认为别名很好,它可以使内部 API 更具可读性,并且您可以依靠编译器来帮助消除某些类别的错误;但是,这不允许您向自定义类型添加功能。如果需要,则需要另一种方法,嵌入或简单组合(即View
具有Set
)。
【讨论】:
【参考方案2】:如果其他人回到这个问题,现在支持 Go 1.9 类型别名。
类型别名的形式为:type T1 = T2
因此,在您的示例中,您只需执行type View = set.Set
,一切都会按您的意愿进行。
【讨论】:
以上是关于我可以在 Golang 中创建一个类型的别名吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Route53 中创建指向非 aws 主机的 CNAME 吗?
是否可以在 C 中使用 sscanf 在 shell 中创建别名命令?