为什么要基于其他创建go类型?

时间:2013-07-03 17:54:10

标签: go

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

type NewType OldType

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

var x NewType

也可以存储OldType'对象'。有什么好处吗?

2 个答案:

答案 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

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

答案 1 :(得分:3)

  

Go编程语言规范

     

Types

     

类型确定特定于值的值集和操作集   那种类型。

您需要识别一组特定的值和操作。

例如,

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}