Go言語での定義型の作成は、アプリケーション固有のドメインロジックを効率的に扱うための重要な技術である。
関心事を分離し、コードの凝集度を高めることができる。
スライスへの型定義
スライスに対する型定義は、コードの見通しを良くし、ユニットテストを容易にするという利点がある。
例えば、特定の条件を満たす要素のみを抽出するメソッドを定義型に追加することができる。
package main
import (
"fmt"
)
// Consumer 型の定義
type Consumer struct {
Name string
ActiveFlg bool
}
// Consumers 型の定義
type Consumers []Consumer
// ActiveConsumer メソッドの定義
func (c Consumers) ActiveConsumer() Consumers {
var resp Consumers
for _, v := range c {
if v.ActiveFlg {
resp = append(resp, v)
}
}
return resp
}
func main() {
consumers := Consumers{
{Name: "Alice", ActiveFlg: true},
{Name: "Bob", ActiveFlg: false},
{Name: "Charlie", ActiveFlg: true},
}
activeConsumers := consumers.ActiveConsumer()
fmt.Println("Active Consumers:", activeConsumers)
}
値への型定義
個々のデータ要素に対して型定義を行うこともできる。
これにより、特定の値に特有のロジックを組み込むことが可能になり、バリューオブジェクトのような実装が可能になる。
package main
import (
"fmt"
)
// SKUCode 型の定義
type SKUCode string
// SKUCode 型のメソッド定義
func (c SKUCode) ItemCD() string {
return string(c)[0:5]
}
func main() {
var sku SKUCode = "T0123010102"
itemCD := sku.ItemCD()
fmt.Println("Item Code:", itemCD)
}
列挙への型定義
列挙型のようなデータに対しても、Goでは特定の処理をレシーバーとして追加することができる。
これにより、特定の条件に基づく複雑なロジックを効率的に処理できるようになります。
package main
import (
"fmt"
)
// Season 型の定義
type Season int
const (
Peak Season = iota + 1
Normal
Off
)
// Season 型のメソッド定義
func (s Season) Price(price float64) float64 {
if s == Peak {
return price + 200
}
return price
}
func main() {
var currentSeason Season = Peak
price := currentSeason.Price(1000)
fmt.Println("Price:", price)
}
構造体への型定義
構造体に対して型定義を行うことも一般的。
構造体のフィールドやメソッドを通じて、より洗練されたデータ操作を実現することができる。
package main
import (
"fmt"
)
// SensorData 型の定義
type SensorData struct {
SensorType string
Value float32
}
// SensorData 型のメソッド定義
func (r SensorData) ReadValue() float32 {
if r.SensorType == "Fahrenheit" {
return (r.Value - 32) * 5 / 9 // 華氏を摂氏に変換
}
return r.Value
}
func main() {
sensor := SensorData{SensorType: "Fahrenheit", Value: 86}
value := sensor.ReadValue()
fmt.Println("Temperature:", value, "°C")
}
参考