3

在 go 中定义新类型的目的是什么:

type NewType OldType

因为 NewType 只有方法声明,所以:

var x NewType

还可以存储 OldType '对象'。有什么优势吗?

4

2 回答 2

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

只是为了澄清(因为我对“别名”一词的使用可能会产生误导),两种在其他方面等价的类型(例如,interrorCode上面的示例中)是不可互换的。Go 类型系统将它们视为根本不同的类型,尽管您可以在它们之间进行类型转换。

于 2013-07-03T19:05:31.277 回答
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}
于 2013-07-03T18:01:07.183 回答