自分でMarshalXxx/UnmarshalXxx関数を定義するこの章についてGraphQLクエリで取得するフィールドは全てスカラ型になっている必要があります。}}組み込みでは5つのスカラが用意されており、それぞれがGoの中では対応する適切なデータ型に対応づけられるようになっています。identifierとしての機能を持ったフィールドであればこのID型にするのが望ましいです。これ以外にもスカラ型を自作し用意したい場面が存在します。この章ではそのようなカスタムスカラ型の導入方法を解説します。今回利用しているGraphQLスキーマの中から、カスタムスカラを使っている場所を紹介します。DateTime日時を表すDateTime型が定義されており、RepositoryオブジェクトのcreatedAtフィールドなどで用いられています。DateTime!}何の設定も施さないままgqlgenにてコードを自動生成させると、DateTime型に対応するGo構造体フィールドはstring型になってしまいます。`json:"createdAt"`}これをGo側でもtime.Time型にできるととても便利になるでしょう。これがカスタムスカラ型導入の動機になります。URIDateTime型以外にも、IssueやPRのURLを表すためのURI型というカスタムスカラ型も定義されています。URI!}こちらも特別な設定なしではGo側でstring型として扱われてしまいます。これもurl.URL型にしたいです。`json:"url"`}カスタムスカラの実装GraphQLスキーマで定義したカスタムスカラ型に対応付けさせるGoの型を変更するには、以下の3つの方法があります。サードパーティライブラリに用意されたカスタムスカラ対応型を使う実装方法github.com/99designs/gqlgenには、よく使われるであろうカスタムスカラ対応ロジックが用意されています。独自に定義したカスタムスカラをGoのtime.Time型に対応させるロジックも例に漏れません。今回スキーマ中のDateTime型をGoのtime.Time型にさせたいので、gqlgenの設定ファイルgqlgen.ymlの中に以下のように設定を書き加えます。generateコマンドを実行すると、models_gen.goの中に生成されているモデル型が以下のように変わっていることが確認できるはずです。`json:"createdAt"`}github.com/99designs/gqlgenに用意されたカスタムスカラ対応型github.com/99designs/gqlgen/graphql.Timeのように、gqlgen.ymlに指定することでカスタムスカラの対応Go型を変えることができる仕組みは他にも存在します。独自型にMarshalGQL/UnmarshalGQLメソッドを実装するgithub.com/99designs/gqlgenに用意されていない型に自分のカスタムスカラ型を対応させたい場合というのも存在します。今回の場合URI型がその例です。URIGraphQLのカスタムスカラ型に対応づけさせたいGoの構造体は、graphql.Marshalerインターフェースとgraphql.Unmarshalerインターフェースを満たす必要があります。error}例えば今回自分で定義したMyURL型にカスタムスカラ型URIを対応づけさせるためには、まずMyURL型にMarshalGQL/UnmarshalGQLメソッドを実装する必要があります。generateコマンドでコードを再生成させると、URI型を利用していたIssue.URLフィールドの定義が変わることが確認できます。自分でMarshalXxx/UnmarshalXxx関数を定義する方法その2のときは、カスタムスカラURI型をマッピングするのが自分で定義したMyURL型だったため、自由にMarshalGQL/UnmarshalGQLメソッドを追加することができました。カスタムスカラURI型を標準パッケージ内にあるurl.URL型にマッピングさせたいということを考えるならば、方法その2は使えません。標準パッケージnet/urlに定義されている既存の型url.URLにメソッドを追加実装することができないからです。このように、既存のサードパッケージ型・標準パッケージ型といった、自分の判断でMarshalGQL/UnmarshalGQLメソッドを追加できないようなパターンが存在します。そのような場合には、MarshalXxx/UnmarshalXxx関数を用意することになります。v)}}このようにMarshalURI/UnmarshalURI関数を定義した後に、gqlgen.yml内に以下のように設定を書き加えコードを再生させれば、見事カスタムスカラURI型を標準パッケージ内にあるurl.URL型に紐づけることができます。