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 では、自分で定義していない既存の型 (つまり、組み込み型や他のパッケージで定義された型) にメソッドを追加することはできません。そのため、エイリアスを使用すると、それらを自分で定義したふりをして、それらにメソッドを追加できます。これについて考えるもう 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 型システムは、これらを基本的に異なる型として扱いますが、それらの間で型キャストを行うことはできます。
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}