🎄

Go の文字列が事前宣言された識別子やキーワードか調べる

2024/12/09に公開

これは Go Advent Calendar 2024 の 9 日目の記事です。

Go には事前宣言された識別子やキーワードがあり、仕様書 (The Go Programming Language Specification) に一覧が記載されています。また、ある文字列がそれらに含まれるかどうかを判定する関数が標準ライブラリに用意されています。

Predeclared identifiers (事前宣言された識別子)

型、定数、ゼロ値、関数が含まれています。仕様書の Predeclared identifiers に一覧が記載されています。

Types:
	any bool byte comparable
	complex64 complex128 error float32 float64
	int int8 int16 int32 int64 rune string
	uint uint8 uint16 uint32 uint64 uintptr

Constants:
	true false iota

Zero value:
	nil

Functions:
	append cap clear close complex copy delete imag len
	make max min new panic print println real recover

これらは doc.IsPredeclared() で判定できます。

https://go.dev/play/p/bqHxtIkfiDx

package main

import (
	"fmt"
	"go/doc"
)

func main() {
	for _, s := range []string{"any", "true", "nil", "append", "foo"} {
		fmt.Println(s, doc.IsPredeclared(s))
	}
}
any true
true true
nil true
append true
foo false

Program exited.

Keywords (キーワード)

func や return などが該当します。仕様書の Keywords に一覧が記載されています。

break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

これらは token.IsKeyword() で判定できます。

https://go.dev/play/p/NMSonggIou2

package main

import (
	"fmt"
	"go/token"
)

func main() {
	for _, s := range []string{"func", "return", "foo"} {
		fmt.Println(s, token.IsKeyword(s))
	}
}
func true
return true
foo false

Program exited.

Discussion