在go中定义新类型的目的是什么:
type NewType OldType
因为NewType只有方法声明,所以:
var x NewType
也可以存储OldType'对象'。有什么好处吗?
答案 0 :(得分:5)
一般来说命名类型背后的原因相当简单,并且在大多数语言中大致相同 - 能够命名复杂类型,例如:
type Person struct{
name String
age uint8
}
然而,命名一个你所描述的类型,我称之为“类型别名”(不确定这是否被其他人使用,但这是我倾向于使用的术语),并不会给你上述 - 提到的优势。然而,所做的给你的是能够向现有类型添加方法的能力。 Go不允许您将方法添加到您自己未定义的现有类型(即,其他包中定义的内置类型或类型),因此别名允许您假装您做了自己定义它们,从而为它们添加方法。考虑它的另一个好方法就是创建一个包装类型的更简洁的版本(例如,像在Java这样的OO语言中)。
所以,让我们说我希望能够将整数用作错误。在Go中,error
接口只需要一个名为“Error”的方法,该方法返回一个字符串。使用类型别名,我可以这样做:
type errorCode int
func (e errorCode) Error() string {
return fmt.Sprintf("%d", e)
}
...我可以使用整数错误代码。相比之下,如果我尝试以下操作,我会收到错误:
func (e int) Error() string {
return fmt.Sprintf("%d", e)
}
要演示,请查看此实现: http://play.golang.org/p/9NO6Lcdsbq
只是为了澄清(因为我对“别名”一词的使用可能会产生误导),两种等效的类型(例如,上例中的int
和errorCode
)不可互换。 Go类型系统将它们视为根本不同的类型,尽管您可以在它们之间进行类型转换。
答案 1 :(得分:3)
Go编程语言规范
类型确定特定于值的值集和操作集 那种类型。
您需要识别一组特定的值和操作。
例如,
package main
import "fmt"
type Coordinate float64
type Point struct {
x, y Coordinate
}
func (p *Point) Move(dx, dy Coordinate) {
p.x += dx
p.y += dy
}
func main() {
var p = Point{3.14159, 2.718}
fmt.Println(p)
p.Move(-1, +1)
fmt.Println(p)
}
输出:
{3.14159 2.718}
{2.14159 3.718}