miyazi888の覚え書き日記

学習したことを書き留めてます。

Go言語のDefined Typeについて

仕事中のコードに出てきて、最初、知らなくて戸惑ったのが、このDefined Type。 以前はNamed Typeと呼ばれていたらしい。

機能としては、ある型を別の型として定義することができる機能。 型としてメソッドも追加できる。

何かの特別な形式を持つ文字列とかアプリに必要なドメインに特化した機能を持った型を定義するのに便利そう。

下の参考先のサイトのサンプルを真似て少し処理を記述してみた。 Passwordという型を定義し、8文字以上の文字列を表現する型とした。

package main

import (
    "fmt"
    "log"
)

type Password string // Password型を定義。これがDefined Type

// Password型は8文字以上かどうかのバリデーション。
// Defined Typeにはメソッドも定義可能
func (p Password) Validate() error {
    if len(p) < 8 {
        return fmt.Errorf("パスワードは8文字以上")
    }
    return nil
}

func main() {
    password := Password("password")
    if err := password.Validate(); err != nil {
        log.Fatal(err)
    }

    // Password型とstring型は別モノ。
    // もし処理先で元の型であるstringにしたい場合は以下のようにする
    passString := string(password)
    fmt.Println(passString)
}

うまいこと使えば、かなり使える機能だと思った。

参考

budougumi0617.github.io