在 go 中定义新类型的目的是什么:
type NewType OldType
因为 NewType 只有方法声明,所以:
var x NewType
还可以存储 OldType '对象'。有什么优势吗?
在 go 中定义新类型的目的是什么:
type NewType OldType
因为 NewType 只有方法声明,所以:
var x NewType
还可以存储 OldType '对象'。有什么优势吗?
一般来说,命名类型背后的原因相当简单,并且在大多数语言中都非常相似——能够命名复杂类型,例如:
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 类型系统将它们视为根本不同的类型,尽管您可以在它们之间进行类型转换。
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}