我可以在 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) Interfacefunc (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 中创建一个类型的别名吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中创建一些变量类型别名

我可以在 Route53 中创建指向非 aws 主机的 CNAME 吗?

我可以在 C++ 中创建一个强类型整数吗?

是否可以在 C 中使用 sscanf 在 shell 中创建别名命令?

我可以在 Android 中创建自定义图像 MIME 类型吗?

如何在 Apache Tomcat 中创建“别名”?