---
title: Stringer の生成コードを読む
tags: 
author: [kofuk](https://www.docswell.com/user/kofuk)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/K74VWQN1J1.jpg?width=480
description: Stringer の生成コードを読む by kofuk
published: January 18, 25
canonical: https://www.docswell.com/s/kofuk/ZYD997-2025-01-18-152429
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/K74VWQN1J1.jpg)

Stringer の生成コードを読む
kofuk
2025-01-18
Gopher&#039;s Gathering #ggring


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LJ13YP557G.jpg)

自己紹介
●
福田 航生 (kofuk)
○
X: @man_2_fork
○
福岡生まれ、福岡育ち
○
普段はグループウェアの会社で
Web エンジニアをしています


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJWPG25W72.jpg)

Stringer といえば
●
Go の最も基本的なインタフェースのひとつ
●
実装しておくと任意の型を fmt.Println などで
いい感じに出力できる


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EZKLDN2E3.jpg)

Go で enum を使いたいとき……
●
標準機能に enum がないので、
deﬁned type + 定数で enum を表現する
●
値自体は整数 0, 1, 2, … でしかないので、
いい感じの文字列表現が欲しくなる
○
明示的に Stringer を実装しないといけない


# Page. 5

![Page Image](https://bcdn.docswell.com/page/Y76QW1967V.jpg)

Stringer を自動生成する


# Page. 6

![Page Image](https://bcdn.docswell.com/page/G75RM4N5E4.jpg)

おもしろポイント 1: 謎の関数
●
定数を変更したときに stringer を実行し忘れるのを防ぐ親切機能
●
定数の値が変わっているとコンパイルエラー
○
●
配列の境界値チェックをコンパイル時に行ってくれるため
2019 年ごろに追加された（コミット）


# Page. 7

![Page Image](https://bcdn.docswell.com/page/9J2D9V5GJR.jpg)

おもしろポイント 1: 謎の関数
●
定数の値を入れ替えてみると……
●
index out of bounds でコンパイルが通らなくなる


# Page. 8

![Page Image](https://bcdn.docswell.com/page/DEY243KGEM.jpg)

おもしろポイント 2: 条件によって生成結果が変わる
●
一番単純なパターン
●
ひとつの文字列から文字列を切り出す


# Page. 9

![Page Image](https://bcdn.docswell.com/page/VJN8YVR878.jpg)

おもしろポイント 2: 条件によって生成結果が変わる


# Page. 10

![Page Image](https://bcdn.docswell.com/page/YE9KP6MXE3.jpg)

おもしろポイント 2: 条件によって生成結果が変わる


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GE8RDZL9JD.jpg)

おもしろポイント 2: 条件によって生成結果が変わる
●
他にも配列に入れる整数の型に微妙な最適化が入る
●
このあたりの機能は 2014 の最初のコミットから存在する
●
特に map を使うコードに切り替わる境界値があるが、
その値を決めた理由はよくわからなかった
○
コードレビューとかを見ても特に言及されていない


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LELKMDLMJR.jpg)

番外編: 地味に計算できる


