我可以在 Golang 中创建一个类型的别名吗?
Can I create an alias of a type in Golang?
我正在努力学习围棋。
我在 go 中找到了一个 Set 的巧妙实现:gopkg.in/fatih/set.v0,但我更喜欢用 set.Set
更明确的名称来命名我的集合,做类似的事情:
type View set.Set
本质上,我希望我的 View
类型继承 set.Set
的方法。因为,好吧,View
是一个 set.Set
的描述符。但我知道 Go 在继承和一般输入方面非常出色。
目前我一直在尝试以下 kinda 继承,但是在尝试使用 func Union(set1, set2 Interface, sets ...Interface) Interface
或 [=18= 等函数时会导致大量错误]:
type View struct {
set.Set
}
我想知道是否有一种方法可以像 Go 一样实现我想要的东西,或者我是否只是想将我优秀的 OO 实践应用到一种丢弃它们的语言中,请。
请注意,我认为您最初提出的简单别名在语法上是有效的,尽管快速浏览了 set 库,而不是别名 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
)。
如果其他人回到这个问题,从 Go 1.9 开始,现在支持类型别名。
类型别名的形式为:type T1 = T2
因此,在您的示例中,您只需执行 type View = set.Set
,一切都会如您所愿。
我正在努力学习围棋。
我在 go 中找到了一个 Set 的巧妙实现:gopkg.in/fatih/set.v0,但我更喜欢用 set.Set
更明确的名称来命名我的集合,做类似的事情:
type View set.Set
本质上,我希望我的 View
类型继承 set.Set
的方法。因为,好吧,View
是一个 set.Set
的描述符。但我知道 Go 在继承和一般输入方面非常出色。
目前我一直在尝试以下 kinda 继承,但是在尝试使用 func Union(set1, set2 Interface, sets ...Interface) Interface
或 [=18= 等函数时会导致大量错误]:
type View struct {
set.Set
}
我想知道是否有一种方法可以像 Go 一样实现我想要的东西,或者我是否只是想将我优秀的 OO 实践应用到一种丢弃它们的语言中,请。
请注意,我认为您最初提出的简单别名在语法上是有效的,尽管快速浏览了 set 库,而不是别名 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
)。
如果其他人回到这个问题,从 Go 1.9 开始,现在支持类型别名。
类型别名的形式为:type T1 = T2
因此,在您的示例中,您只需执行 type View = set.Set
,一切都会如您所愿。