🔐
gophenums: type-safe enumライブラリについて
お久しぶりです、エンジニアのビクトルです。
冬休みの前に、自動でenumを発生のライブラリーを実装したかったです。そしてGo
でまだ触ったことがないbuilt-in
パッケージで作成したくて、記事も書きたいと思ってきました。
はじめに
実装したいライブラリーはgo
ファイルの内容からコメントアウトを取ってGolang
のtemplate
がenum
を作成というアイデアです。
こんな理想を考えました。
// このタイプから作成したいで、コメントアウトで `go generate`を実行して自動で作成したい
type animal string
したい発生コードは:
type Animal interface {
__private()
}
func (v animal) __private(){}
詳しくはこの記事を読んでください
Goコードファイルを解釈
Goは、その文書Goプログラミング言語仕様で構文とセマンティクスを定義しています。構文コード、型、宣言、および文がどのように解釈されるべきかを説明しています。
ast
、parser
とtoken
というbuilt-in
ライブラリーを使用することで、Goのソースコードを読み取り、解釈し、トークンに解析することができます。
コードはこんな感じです
package main
import (
"go/ast"
"go/token"
"go/parser"
)
...
token := token.NewFileSet()
f, err := parser.ParseFile(token, filePointer, nil, parser.ParseComments)
...
ast.Inspect(f, func(node ast.Node) bool {
switch expression := node.(type)
case *ast.GenDecl:
...
case N:
...
}
型をキャストしてコメントと検索している型を取得する方法です。
コメントと型を取得するために、ast.GenDecl
やast.TypeSpec
の型に対してswitch
内で確認できます。そこで、コメントがtemplate
パッケージで生成したい型に関連しているかどうかを確認できます。
Show me the code!
ここです!
コントリビューションやフォークなどして学んで遊んでください!
終わり
この記事では、ast
パッケージについて少し詳しく説明し、ワイワイで実装をしました。これが他の人に役立ち、面白いものを構築できることを嬉しいです。☺️
Discussion