こんにちは。KOUKIです。
最近、TypeScriptを学んでおり、「型」というものを強く意識するようになりました。
現職はWeb開発者ですが、PythonやJavaScriptなど、型定義の無い言語ばかり経験を積んでおり、GoやJavaなどを使ったシステム開発の経験はありません。
そのため、「型ってめんどくせーな」と密かに思っていたわけですが、TypeScriptを学んでいくうちに「型ってめっちゃ便利じゃね?」という意識に変わってきました。
こういった経緯もあり、Go言語でも型をガンガン使っていこうと思ったわけです。
本記事では、型の使い方を一部紹介したいと思います。
型を利用する理由
Go言語で型付けするとき「type」キーワードを使います。
そのため、こんな記述をよく見かけると思います。
1 2 3 4 5 |
type Engineer struct { name string work string status string } |
上記は、EngineerというStructの型を定義しました。これはよく見かけるパターンで、私も利用しています。
一方、以下のような型付けもできます。
1 |
type Status string |
Statusをstringで型付けしました。しかし、こういった使い方は、ほとんどしてませんでした。
何故なら、Enginnerのstatusの値は「手入力」で済ませてしまっていた為です。
1 2 3 4 5 |
e := Engineer{ name: "selfnote", work: "Implement Web System", status: "new", // 仕事の状況を手入力 } |
上記では、statusにnewを「手入力」しました。
実際に、サンプルコードを見てみましょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// 型付けを活用できていないコード package main import "fmt" // ビジネスマンを定義 type Engineer struct { name string work string status string } // ビジネスマンのコンストラクタ func NewEngineer(name, work string) Engineer { return Engineer{ name: name, work: name, status: "new", } } func (b *Engineer) ChangeStatus(status string) { b.status = status } func (b *Engineer) ShowStatus() { fmt.Printf("Working Status: %s\n", b.status) } func main() { // セルフノート がWebのシステム開発を受注 selfnote := NewEngineer("Harry", "Implement Web System") selfnote.ShowStatus() // 仕事に着手 selfnote.ChangeStatus("doing") selfnote.ShowStatus() // 納品! selfnote.ChangeStatus("completed") selfnote.ShowStatus() } |
改めて見るとこのコードは、やばいなと思います。statusには「一体何が入るんだ?」という感じです。
他の開発者の立場から考えると、このコードは使うのが少し怖いですね。
これを型付け機能をうまく使って、改善しようというのが本記事の趣旨です。
改善後のコード
型付けを使ったコードのサンプルを以下に記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
// 型付けを活用したコード package main import "fmt" // StatusというTypeを宣言する type Status string // Statusをセット const ( New Status = "New" Doing Status = "doing" Completed Status = "Completed" ) // ビジネスマンを定義 type Engineer struct { name string work string status Status } // ビジネスマンのコンストラクタ func NewEngineer(name, work string) Engineer { return Engineer{ name: name, work: name, status: New, } } func (b *Engineer) ChangeStatus(status Status) { b.status = status } func (b *Engineer) ShowStatus() { fmt.Printf("Working Status: %s\n", b.status) } func main() { // セルフノート がWebのシステム開発を受注 selfnote := NewEngineer("Harry", "Implement Web System") selfnote.ShowStatus() // 仕事に着手 selfnote.ChangeStatus(Doing) selfnote.ShowStatus() // 納品! selfnote.ChangeStatus(Completed) selfnote.ShowStatus() e := Engineer{ name: "selfnote", work: "Implement Web System", status: "new", // 仕事の状況を手入力 } } |
注目していただきたいのは、以下のコードです。
1 2 3 4 5 6 7 8 9 |
// StatusというTypeを宣言する type Status string // Statusをセット const ( New Status = "New" Doing Status = "doing" Completed Status = "Completed" ) |
このようにする事で、statusに入る値を限定できます。
しかも、コード中に「Status」や「New」,「Doing」,「Completed」を使えるので、コードがより文章化されて読みやすいですし、ChangeStatus関数に至っては、Statusで型付けしている変数しか扱えなくしています(限定)。
タイプミスなども絶対にないと思うので、変な値が入ることもないと思います。
おわりに
Go言語を学んでいる人は、TypeScriptも学ぶと良いと思います^^
型付けをうまく活用して、よりレベルの高い開発者になりましょう!
それでは、また!
最近のコメント