typeの概要
新しい型の定義 Goの予約語 | ||
type 概要 |
||
|
基本的なtypeの使い方(型エイリアス)
type
を使うと、既存の型に別名(エイリアス)を定義できます。
package main
import "fmt"
// int型のエイリアスを定義
type Age int
func main() {
var myAge Age = 30
fmt.Println("年齢:", myAge)
}
解説:
type Age int
によって、int
型の別名としてAge
を定義。- 通常の
int
とは別の型として扱われる。
実行結果:
年齢: 30
構造体(struct)の定義
type
を使って構造体を定義し、データを整理できます。
package main
import "fmt"
// 構造体の定義
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "太郎", Age: 25}
fmt.Println("名前:", p.Name)
fmt.Println("年齢:", p.Age)
}
解説:
type Person struct
で、新しいデータ型を定義。Name
(文字列)とAge
(整数)のフィールドを持つ。
実行結果:
名前: 太郎 年齢: 25
構造体にメソッドを定義
type
で定義した構造体にメソッドを追加することで、オブジェクト指向的な振る舞いが可能になります。
package main
import "fmt"
// Person構造体
type Person struct {
Name string
Age int
}
// メソッドの定義
func (p Person) Greet() {
fmt.Printf("こんにちは、私は%sです。\n", p.Name)
}
func main() {
p := Person{Name: "次郎", Age: 20}
p.Greet() // メソッドを呼び出し
}
解説:
func (p Person) Greet()
のように、構造体に関連するメソッドを定義できる。- 値レシーバを使うと、オブジェクトのコピーを操作する。
実行結果:
こんにちは、私は次郎です。
インターフェースの定義
type
を使ってインターフェースを定義し、異なる型で共通の振る舞いを実装できます。
package main
import "fmt"
// インターフェースの定義
type Greeter interface {
Greet()
}
// 構造体
type Person struct {
Name string
}
// インターフェースの実装
func (p Person) Greet() {
fmt.Println("こんにちは、私は", p.Name, "です。")
}
func main() {
var g Greeter = Person{Name: "花子"}
g.Greet()
}
解説:
type Greeter interface
で、Greet
メソッドを持つインターフェースを定義。Person
構造体がGreet
メソッドを実装することで、自動的にGreeter
インターフェースを満たす。
実行結果:
こんにちは、私は花子です。
注意事項
- 新しい型は元の型と互換性がない:
type Age int
はint
とは異なる型として扱われる。 - メソッドを定義するとオブジェクト指向的な設計が可能:
struct
にメソッドを追加することで、関連する動作を定義できる。 - インターフェースは暗黙的に実装される:
struct
がインターフェースのメソッドをすべて実装すると、自動的にそのインターフェースを満たす。
よくある質問
- Q: `type`を使って新しい型を作るメリットは?
- A: コードの可読性と安全性が向上します。例えば、`type Age int` のように別名を作ることで、異なる意味の整数を区別できます。
- Q: `type`で作った型は元の型と互換性がありますか?
- A: いいえ。例えば、`type Age int` は `int` とは別の型として扱われるため、型変換しないと代入できません。
- Q: `type`で定義した構造体を別のパッケージで使うには?
- A: フィールド名を大文字で始めることで、外部パッケージからアクセスできるようになります(例: `type Person struct { Name string }`)。
- Q: `type`を使ってエイリアスを作る場合と、新しい型を作る場合の違いは?
- A: `type MyInt int` は新しい型を作るのに対し、`type MyInt = int`(型エイリアス)は `int` そのものとして扱われます。
- Q: インターフェースを使うメリットは?
- A: 異なる構造体でも共通の振る舞いを持たせることができ、柔軟なコード設計が可能になります。
まとめ
- `type`を使うと、新しい型を定義できる。
- 構造体(`struct`)を作成し、データを整理できる。
- インターフェース(`interface`)を定義し、異なる型に共通の振る舞いを持たせられる。
- 新しい型は元の型と互換性がなく、明示的な型変換が必要。
- エイリアス(`type MyType = OriginalType`)を使うと、元の型と完全互換の型を作れる。