3

goで新しい型を定義する目的は何ですか:

type NewType OldType

NewType にはメソッド宣言しかないため、次のようになります。

var x NewType

OldType の「オブジェクト」も格納できます。何か利点はありますか?

4

2 に答える 2

5

一般に型に名前を付ける理由は単純明快で、ほとんどの言語で同じです。次のような複雑な型に名前を付けることができます。

type Person struct{
    name String
    age  uint8
}

ただし、「タイプエイリアシング」と呼ぶ、あなたが説明したような名前を付けても(これが他の誰かによって使用されているかどうかはわかりませんが、私が使用する傾向がある用語です)、上記の利点は得られません。ただし、既存の型にメソッドを追加する機能が提供されます。Go では、自分で定義していない既存の型 (つまり、組み込み型や他のパッケージで定義された型) にメソッドを追加することはできません。そのため、エイリアスを使用すると、それらを自分で定義したふりをしてそれらにメソッドを追加できます。これについて考えるもう 1 つの良い方法は、(たとえば、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

明確にするために(「エイリアス」という言葉の使用は誤解を招く可能性があるため)、他の点では同等である2つのタイプ(たとえば、int上記errorCodeの例)は交換できません。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 に答える