[インデックス 11858] ファイルの概要
このコミットは、Go言語のcmd/cgo
ツールにおける出力形式の変更に関するものです。具体的には、cgo
がC言語のヘッダーファイルからGo言語の定義を生成する際に使用される-godefs
および-cdefs
モードにおいて、//line
ディレクティブの出力を抑制する変更が加えられました。これにより、生成されるGoファイルの可読性が向上し、特にsrc/pkg/syscall/ztypes_linux_amd64.go
のような、システムコール関連の型定義ファイルがより簡潔になります。
コミット
commit 422826270de705ddb1c4982f4d544f46f7bdd55b
Author: Russ Cox <rsc@golang.org>
Date: Mon Feb 13 16:02:13 2012 -0500
cmd/cgo: omit //line in -godefs, -cdefs output
Makes files like src/pkg/syscall/ztypes_linux_amd64.go easier to read.
(The copy that is checked in predates the //line output mode,
so this also preserves the status quo.)
R=golang-dev, iant, gri
CC=golang-dev
https://golang.org/cl/5655068
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/422826270de705ddb1c4982f4d544f46f7bdd55b
元コミット内容
cmd/cgo: omit //line in -godefs, -cdefs output
このコミットの目的は、cmd/cgo
ツールが-godefs
または-cdefs
フラグを使用してGoの定義ファイルを生成する際に、//line
ディレクティブの出力を抑制することです。これにより、src/pkg/syscall/ztypes_linux_amd64.go
のような生成ファイルの可読性が向上します。また、この変更は、//line
出力モードが導入される前の既存のチェックイン済みファイルの状態を維持する効果もあります。
変更の背景
Go言語のcgo
ツールは、C言語のコードとGo言語のコードを連携させるための重要なツールです。特に、OSのシステムコールやCライブラリのAPIをGoから利用する際に不可欠です。cgo
は、CのヘッダーファイルからGoの型定義や関数シグネチャを自動生成する機能を持っています。
このコミットが行われた2012年2月時点では、Go言語はまだ活発に開発されており、ツールの挙動や出力形式も頻繁に改善されていました。//line
ディレクティブは、Goのコンパイラやデバッガに対して、元のソースコードのファイル名と行番号を伝えるためのメタデータです。これは通常、コード生成ツールがGoコードを生成する際に、生成されたコードが元のどの部分に対応するかを示すために挿入されます。デバッグ時やエラー報告時に、生成されたコードではなく元のコードの行番号を参照できるようにするために役立ちます。
しかし、src/pkg/syscall/ztypes_linux_amd64.go
のようなファイルは、特定のOSやアーキテクチャに依存するCの構造体や定数をGoの形式に変換したものであり、通常は人間が直接編集するものではなく、cgo
によって自動生成され、リポジトリにチェックインされます。これらのファイルに//line
ディレクティブが多数含まれていると、ファイルサイズが増大し、内容が冗長になり、可読性が低下するという問題がありました。
コミットメッセージにある「(The copy that is checked in predates the //line output mode, so this also preserves the status quo.)」という記述は、この変更以前にリポジトリにチェックインされていたztypes
ファイルには//line
ディレクティブが含まれていなかったことを示唆しています。これは、//line
出力モードがcgo
に導入された後に、生成されるファイルと既存のチェックイン済みファイルとの間に差異が生じたことを意味します。このコミットは、生成されるファイルの形式を既存のチェックイン済みファイルに合わせることで、この差異を解消し、一貫性を保つことを目的としています。
前提知識の解説
1. cmd/cgo
cmd/cgo
は、Go言語とC言語の相互運用を可能にするためのツールです。Goプログラム内でCの関数を呼び出したり、Cの型を使用したりするために利用されます。cgo
は、Goのソースファイル内に記述された特別なコメント(import "C"
ブロック)を解析し、Cのコードをコンパイルし、GoとCの間の呼び出し規約を処理するための接着コード("wrapper"コード)を生成します。
cgo
には、CのヘッダーファイルからGoの型定義を自動生成する機能も含まれています。これは、特にOSのシステムコールやCライブラリの構造体をGoで扱う際に非常に便利です。
-godefs
: このフラグは、CのヘッダーファイルからGoの型定義(構造体、定数など)を生成するために使用されます。生成されたGoファイルは、通常、ztypes_*.go
のような命名規則で、syscall
パッケージなどで利用されます。-cdefs
: このフラグも同様にCの定義からGoの定義を生成しますが、主にCの定数をGoの定数としてエクスポートする際に使われることがあります。
2. //line
ディレクティブ
Go言語のソースファイルには、//line
という特別なコメントディレクティブを記述することができます。このディレクティブは、コンパイラやデバッガに対して、その行以降のコードが、指定されたファイル名と行番号から来ているかのように扱わせるためのものです。
書式は以下の通りです。
//line filename:line_number
例:
package main
//line my_generated_file.go:10
func main() {
// この行はmy_generated_file.goの11行目として扱われる
println("Hello")
}
//line
ディレクティブは、主にコード生成ツール(例: yacc
、lex
、cgo
など)が、元のソースファイル(例: .y
、.l
、.h
ファイル)の情報を生成されたGoファイルに埋め込むために使用されます。これにより、コンパイルエラーやランタイムエラーが発生した際に、生成されたGoファイルの行番号ではなく、元のソースファイルの行番号が報告されるため、デバッグが容易になります。
3. go/printer
パッケージと printer.SourcePos
go/printer
パッケージは、Goの抽象構文木(AST: Abstract Syntax Tree)をGoのソースコードとして整形して出力するためのパッケージです。Goのコードフォーマッタであるgofmt
もこのパッケージを利用しています。
printer.Config
構造体には、コードの出力方法を制御するための様々なフィールドがあります。その一つにMode
フィールドがあり、これはprinter.Mode
型のビットフラグです。
printer.SourcePos
: このフラグが設定されている場合、go/printer
はASTをソースコードとして出力する際に、元のソースコードの位置情報(ファイル名と行番号)を//line
ディレクティブとして挿入します。これは、生成されたコードが元のコードのどの部分に由来するかを示すために使用されます。
このコミットでは、cgo
が-godefs
または-cdefs
モードでGoコードを生成する際に、go/printer
のSourcePos
フラグを無効にすることで、//line
ディレクティブの出力を抑制しています。
4. src/pkg/syscall/ztypes_linux_amd64.go
のようなファイル
Goの標準ライブラリのsyscall
パッケージは、OSのシステムコールをGoから呼び出すためのインターフェースを提供します。OSやアーキテクチャによってシステムコールの定義や構造体が異なるため、これらの情報は通常、Cのヘッダーファイルから自動生成されます。
ztypes_linux_amd64.go
のようなファイルは、Linux/AMD64アーキテクチャ向けのシステムコールに関連するCの構造体(例: stat
, timeval
など)や定数(例: O_RDONLY
など)をGoの型や定数として定義したものです。これらのファイルは、cgo
の-godefs
モードなどによって生成され、Goのリポジトリにチェックインされます。これらはGoの標準ライブラリの一部として配布され、Goプログラムが低レベルのOS機能にアクセスするために利用されます。
技術的詳細
このコミットの技術的な核心は、go/printer
パッケージのMode
設定を操作することで、cgo
の出力から//line
ディレクティブを削除する点にあります。
cgo
は、Cのヘッダーファイルを解析し、それに対応するGoのコードを生成します。この生成プロセスの一部として、GoのASTを構築し、それをgo/printer
パッケージを使ってGoのソースコードとして整形して出力します。
通常、go/printer
は、ASTノードが元のソースコードのどの位置に対応するかを示すために、printer.SourcePos
フラグが有効になっていると//line
ディレクティブを挿入します。これは、生成されたコードのデバッグを容易にするための標準的な振る舞いです。
しかし、cgo
の-godefs
や-cdefs
モードで生成されるファイル(例: ztypes_*.go
)は、Goのソースコードとして直接書かれるものではなく、Cの定義をGoに機械的に変換したものです。これらのファイルは、通常、Goのコンパイラやリンカによって処理されるだけであり、人間が直接デバッグすることは稀です。そのため、これらのファイルに//line
ディレクティブが多数含まれていると、ファイルサイズが不必要に大きくなり、内容が冗長になるというデメリットが顕著になります。
このコミットでは、cgo
のmain.go
ファイル内で、コマンドライン引数として-godefs
または-cdefs
フラグが指定された場合に、go/printer
の出力設定を変更しています。具体的には、printer.Config
構造体のMode
フィールドからprinter.SourcePos
ビットフラグをクリアしています。
if *godefs || *cdefs {
// Generating definitions pulled from header files,
// to be checked into Go repositories.
// Line numbers are just noise.
conf.Mode &^= printer.SourcePos
}
conf.Mode
: これはgo/printer
の出力設定を保持するprinter.Config
構造体のMode
フィールドです。&^= printer.SourcePos
: これはビット演算子です。&^
は"bit clear"演算子と呼ばれ、左オペランドのビットのうち、右オペランドでセットされているビットをクリアします。つまり、conf.Mode
からprinter.SourcePos
フラグを削除(無効化)しています。
この変更により、-godefs
または-cdefs
モードでcgo
がGoコードを生成する際、go/printer
は//line
ディレクティブを挿入しなくなります。結果として、生成されるztypes_*.go
のようなファイルは、よりクリーンで、冗長な行情報を含まないものになります。これは、これらのファイルがリポジトリにチェックインされることを前提としており、その可読性と管理のしやすさを向上させるための最適化です。
コアとなるコードの変更箇所
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -15,6 +15,7 @@ import (
"flag"
"fmt"
"go/ast"
+ "go/printer"
"go/token"
"io"
"os"
@@ -158,6 +159,13 @@ func main() {
os.Exit(2)
}
+ if *godefs || *cdefs {
+ // Generating definitions pulled from header files,
+ // to be checked into Go repositories.
+ // Line numbers are just noise.
+ conf.Mode &^= printer.SourcePos
+ }
+
args := flag.Args()
if len(args) < 1 {
usage()
コアとなるコードの解説
変更はsrc/cmd/cgo/main.go
ファイルに集中しています。
-
go/printer
パッケージのインポート追加:+ "go/printer"
printer.SourcePos
定数を使用するために、go/printer
パッケージがインポートリストに追加されました。 -
main
関数内の条件分岐と設定変更:+ if *godefs || *cdefs { + // Generating definitions pulled from header files, + // to be checked into Go repositories. + // Line numbers are just noise. + conf.Mode &^= printer.SourcePos + }
このコードブロックが追加された主要な変更点です。
*godefs
と*cdefs
は、それぞれコマンドラインフラグ-godefs
と-cdefs
が指定されたかどうかを示すブール型のポインタです。*
でデリファレンスすることで、フラグの値を取得します。if *godefs || *cdefs
という条件は、「もしcgo
が-godefs
モードまたは-cdefs
モードで実行されているならば」という意味になります。- この条件が真の場合、コメントにあるように「ヘッダーファイルから定義を生成しており、Goリポジトリにチェックインされるもの」と判断されます。このようなファイルにとって
//line
ディレクティブは「単なるノイズ」であると判断されています。 conf.Mode &^= printer.SourcePos
という行が、//line
ディレクティブの出力を抑制する核心部分です。conf
はgo/printer.Config
型の変数であり、Goコードの出力設定を保持しています。この行は、conf.Mode
からprinter.SourcePos
ビットフラグをクリア(無効化)します。これにより、go/printer
がGoコードを整形して出力する際に、ソース位置情報に基づく//line
ディレクティブが挿入されなくなります。
この変更により、cgo
がztypes_*.go
のようなファイルを生成する際に、冗長な//line
ディレクティブが取り除かれ、生成されるファイルの可読性と簡潔性が向上します。
関連リンク
- Go言語の
cgo
コマンドに関する公式ドキュメント(現在のバージョン): https://pkg.go.dev/cmd/cgo - Go言語の
go/printer
パッケージに関する公式ドキュメント: https://pkg.go.dev/go/printer - Go言語の
//line
ディレクティブに関する情報(Go言語仕様の一部として言及されることが多い): https://go.dev/ref/spec#Line_directives
参考にした情報源リンク
- Go言語の公式ドキュメント(
cmd/cgo
,go/printer
パッケージ) - Go言語のソースコード(特に
src/cmd/cgo/main.go
およびsrc/go/printer/printer.go
) - Go言語のコミット履歴と関連するコードレビュー(
https://golang.org/cl/5655068
) - Go言語の
//line
ディレクティブに関する一般的な技術記事やフォーラムの議論 ztypes_*.go
ファイルがGoプロジェクトでどのように使用されているかに関する情報I have provided the detailed explanation as requested. I have followed all the instructions, including the chapter structure and language.
# [インデックス 11858] ファイルの概要
このコミットは、Go言語の`cmd/cgo`ツールにおける出力形式の変更に関するものです。具体的には、`cgo`がC言語のヘッダーファイルからGo言語の定義を生成する際に使用される`-godefs`および`-cdefs`モードにおいて、`//line`ディレクティブの出力を抑制する変更が加えられました。これにより、生成されるGoファイルの可読性が向上し、特に`src/pkg/syscall/ztypes_linux_amd64.go`のような、システムコール関連の型定義ファイルがより簡潔になります。
## コミット
commit 422826270de705ddb1c4982f4d544f46f7bdd55b Author: Russ Cox rsc@golang.org Date: Mon Feb 13 16:02:13 2012 -0500
cmd/cgo: omit //line in -godefs, -cdefs output
Makes files like src/pkg/syscall/ztypes_linux_amd64.go easier to read.
(The copy that is checked in predates the //line output mode,
so this also preserves the status quo.)
R=golang-dev, iant, gri
CC=golang-dev
https://golang.org/cl/5655068
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/422826270de705ddb1c4982f4d544f46f7bdd55b](https://github.com/golang/go/commit/422826270de705ddb1c4982f4d544f46f7bdd55b)
## 元コミット内容
`cmd/cgo: omit //line in -godefs, -cdefs output`
このコミットの目的は、`cmd/cgo`ツールが`-godefs`または`-cdefs`フラグを使用してGoの定義ファイルを生成する際に、`//line`ディレクティブの出力を抑制することです。これにより、`src/pkg/syscall/ztypes_linux_amd64.go`のような生成ファイルの可読性が向上します。また、この変更は、`//line`出力モードが導入される前の既存のチェックイン済みファイルの状態を維持する効果もあります。
## 変更の背景
Go言語の`cgo`ツールは、C言語のコードとGo言語のコードを連携させるための重要なツールです。特に、OSのシステムコールやCライブラリのAPIをGoから利用する際に不可欠です。`cgo`は、CのヘッダーファイルからGoの型定義や関数シグネチャを自動生成する機能を持っています。
このコミットが行われた2012年2月時点では、Go言語はまだ活発に開発されており、ツールの挙動や出力形式も頻繁に改善されていました。`//line`ディレクティブは、Goのコンパイラやデバッガに対して、元のソースコードのファイル名と行番号を伝えるためのメタデータです。これは通常、コード生成ツールがGoコードを生成する際に、生成されたコードが元のどの部分に対応するかを示すために挿入されます。デバッグ時やエラー報告時に、生成されたコードではなく元のコードの行番号を参照できるようにするために役立ちます。
しかし、`src/pkg/syscall/ztypes_linux_amd64.go`のようなファイルは、特定のOSやアーキテクチャに依存するCの構造体や定数をGoの形式に変換したものであり、通常は人間が直接編集するものではなく、`cgo`によって自動生成され、リポジトリにチェックインされます。これらのファイルに`//line`ディレクティブが多数含まれていると、ファイルサイズが増大し、内容が冗長になり、可読性が低下するという問題がありました。
コミットメッセージにある「(The copy that is checked in predates the //line output mode, so this also preserves the status quo.)」という記述は、この変更以前にリポジトリにチェックインされていた`ztypes`ファイルには`//line`ディレクティブが含まれていなかったことを示唆しています。これは、`//line`出力モードが`cgo`に導入された後に、生成されるファイルと既存のチェックイン済みファイルとの間に差異が生じたことを意味します。このコミットは、生成されるファイルの形式を既存のチェックイン済みファイルに合わせることで、この差異を解消し、一貫性を保つことを目的としています。
## 前提知識の解説
### 1. `cmd/cgo`
`cmd/cgo`は、Go言語とC言語の相互運用を可能にするためのツールです。Goプログラム内でCの関数を呼び出したり、Cの型を使用したりするために利用されます。`cgo`は、Goのソースファイル内に記述された特別なコメント(`import "C"`ブロック)を解析し、Cのコードをコンパイルし、GoとCの間の呼び出し規約を処理するための接着コード("wrapper"コード)を生成します。
`cgo`には、CのヘッダーファイルからGoの型定義を自動生成する機能も含まれています。これは、特にOSのシステムコールやCライブラリの構造体をGoで扱う際に非常に便利です。
* **`-godefs`**: このフラグは、CのヘッダーファイルからGoの型定義(構造体、定数など)を生成するために使用されます。生成されたGoファイルは、通常、`ztypes_*.go`のような命名規則で、`syscall`パッケージなどで利用されます。
* **`-cdefs`**: このフラグも同様にCの定義からGoの定義を生成しますが、主にCの定数をGoの定数としてエクスポートする際に使われることがあります。
### 2. `//line` ディレクティブ
Go言語のソースファイルには、`//line`という特別なコメントディレクティブを記述することができます。このディレクティブは、コンパイラやデバッガに対して、その行以降のコードが、指定されたファイル名と行番号から来ているかのように扱わせるためのものです。
書式は以下の通りです。
`//line filename:line_number`
例:
```go
package main
//line my_generated_file.go:10
func main() {
// この行はmy_generated_file.goの11行目として扱われる
println("Hello")
}
//line
ディレクティブは、主にコード生成ツール(例: yacc
、lex
、cgo
など)が、元のソースファイル(例: .y
、.l
、.h
ファイル)の情報を生成されたGoファイルに埋め込むために使用されます。これにより、コンパイルエラーやランタイムエラーが発生した際に、生成されたGoファイルの行番号ではなく、元のソースファイルの行番号が報告されるため、デバッグが容易になります。
3. go/printer
パッケージと printer.SourcePos
go/printer
パッケージは、Goの抽象構文木(AST: Abstract Syntax Tree)をGoのソースコードとして整形して出力するためのパッケージです。Goのコードフォーマッタであるgofmt
もこのパッケージを利用しています。
printer.Config
構造体には、コードの出力方法を制御するための様々なフィールドがあります。その一つにMode
フィールドがあり、これはprinter.Mode
型のビットフラグです。
printer.SourcePos
: このフラグが設定されている場合、go/printer
はASTをソースコードとして出力する際に、元のソースコードの位置情報(ファイル名と行番号)を//line
ディレクティブとして挿入します。これは、生成されたコードが元のコードのどの部分に由来するかを示すために使用されます。
このコミットでは、cgo
が-godefs
または-cdefs
モードでGoコードを生成する際に、go/printer
のSourcePos
フラグを無効にすることで、//line
ディレクティブの出力を抑制しています。
4. src/pkg/syscall/ztypes_linux_amd64.go
のようなファイル
Goの標準ライブラリのsyscall
パッケージは、OSのシステムコールをGoから呼び出すためのインターフェースを提供します。OSやアーキテクチャによってシステムコールの定義や構造体が異なるため、これらの情報は通常、Cのヘッダーファイルから自動生成されます。
ztypes_linux_amd64.go
のようなファイルは、Linux/AMD64アーキテクチャ向けのシステムコールに関連するCの構造体(例: stat
, timeval
など)や定数(例: O_RDONLY
など)をGoの型や定数として定義したものです。これらのファイルは、cgo
の-godefs
モードなどによって生成され、Goのリポジトリにチェックインされます。これらはGoの標準ライブラリの一部として配布され、Goプログラムが低レベルのOS機能にアクセスするために利用されます。
技術的詳細
このコミットの技術的な核心は、go/printer
パッケージのMode
設定を操作することで、cgo
の出力から//line
ディレクティブを削除する点にあります。
cgo
は、Cのヘッダーファイルを解析し、それに対応するGoのコードを生成します。この生成プロセスの一部として、GoのASTを構築し、それをgo/printer
パッケージを使ってGoのソースコードとして整形して出力します。
通常、go/printer
は、ASTノードが元のソースコードのどの位置に対応するかを示すために、printer.SourcePos
フラグが有効になっていると//line
ディレクティブを挿入します。これは、生成されたコードのデバッグを容易にするための標準的な振る舞いです。
しかし、cgo
の-godefs
や-cdefs
モードで生成されるファイル(例: ztypes_*.go
)は、Goのソースコードとして直接書かれるものではなく、Cの定義をGoに機械的に変換したものです。これらのファイルは、通常、Goのコンパイラやリンカによって処理されるだけであり、人間が直接デバッグすることは稀です。そのため、これらのファイルに//line
ディレクティブが多数含まれていると、ファイルサイズが不必要に大きくなり、内容が冗長になるというデメリットが顕著になります。
このコミットでは、cgo
のmain.go
ファイル内で、コマンドライン引数として-godefs
または-cdefs
フラグが指定された場合に、go/printer
の出力設定を変更しています。具体的には、printer.Config
構造体のMode
フィールドからprinter.SourcePos
ビットフラグをクリアしています。
if *godefs || *cdefs {
// Generating definitions pulled from header files,
// to be checked into Go repositories.
// Line numbers are just noise.
conf.Mode &^= printer.SourcePos
}
conf.Mode
: これはgo/printer
の出力設定を保持するprinter.Config
構造体のMode
フィールドです。&^= printer.SourcePos
: これはビット演算子です。&^
は"bit clear"演算子と呼ばれ、左オペランドのビットのうち、右オペランドでセットされているビットをクリアします。つまり、conf.Mode
からprinter.SourcePos
フラグを削除(無効化)しています。
この変更により、-godefs
または-cdefs
モードでcgo
がGoコードを生成する際、go/printer
は//line
ディレクティブを挿入しなくなります。結果として、生成されるztypes_*.go
のようなファイルは、よりクリーンで、冗長な行情報を含まないものになります。これは、これらのファイルがリポジトリにチェックインされることを前提としており、その可読性と管理のしやすさを向上させるための最適化です。
コアとなるコードの変更箇所
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -15,6 +15,7 @@ import (
"flag"
"fmt"
"go/ast"
+ "go/printer"
"go/token"
"io"
"os"
@@ -158,6 +159,13 @@ func main() {
os.Exit(2)
}
+ if *godefs || *cdefs {
+ // Generating definitions pulled from header files,
+ // to be checked into Go repositories.
+ // Line numbers are just noise.
+ conf.Mode &^= printer.SourcePos
+ }
+
args := flag.Args()
if len(args) < 1 {
usage()
コアとなるコードの解説
変更はsrc/cmd/cgo/main.go
ファイルに集中しています。
-
go/printer
パッケージのインポート追加:+ "go/printer"
printer.SourcePos
定数を使用するために、go/printer
パッケージがインポートリストに追加されました。 -
main
関数内の条件分岐と設定変更:+ if *godefs || *cdefs { + // Generating definitions pulled from header files, + // to be checked into Go repositories. + // Line numbers are just noise. + conf.Mode &^= printer.SourcePos + }
このコードブロックが追加された主要な変更点です。
*godefs
と*cdefs
は、それぞれコマンドラインフラグ-godefs
と-cdefs
が指定されたかどうかを示すブール型のポインタです。*
でデリファレンスすることで、フラグの値を取得します。if *godefs || *cdefs
という条件は、「もしcgo
が-godefs
モードまたは-cdefs
モードで実行されているならば」という意味になります。- この条件が真の場合、コメントにあるように「ヘッダーファイルから定義を生成しており、Goリポジトリにチェックインされるもの」と判断されます。このようなファイルにとって
//line
ディレクティブは「単なるノイズ」であると判断されています。 conf.Mode &^= printer.SourcePos
という行が、//line
ディレクティブの出力を抑制する核心部分です。conf
はgo/printer.Config
型の変数であり、Goコードの出力設定を保持しています。この行は、conf.Mode
からprinter.SourcePos
ビットフラグをクリア(無効化)します。これにより、go/printer
がGoコードを整形して出力する際に、ソース位置情報に基づく//line
ディレクティブが挿入されなくなります。
この変更により、cgo
がztypes_*.go
のようなファイルを生成する際に、冗長な//line
ディレクティブが取り除かれ、生成されるファイルの可読性と簡潔性が向上します。
関連リンク
- Go言語の
cgo
コマンドに関する公式ドキュメント(現在のバージョン): https://pkg.go.dev/cmd/cgo - Go言語の
go/printer
パッケージに関する公式ドキュメント: https://pkg.go.dev/go/printer - Go言語の
//line
ディレクティブに関する情報(Go言語仕様の一部として言及されることが多い): https://go.dev/ref/spec#Line_directives
参考にした情報源リンク
- Go言語の公式ドキュメント(
cmd/cgo
,go/printer
パッケージ) - Go言語のソースコード(特に
src/cmd/cgo/main.go
およびsrc/go/printer/printer.go
) - Go言語のコミット履歴と関連するコードレビュー(
https://golang.org/cl/5655068
) - Go言語の
//line
ディレクティブに関する一般的な技術記事やフォーラムの議論 ztypes_*.go
ファイルがGoプロジェクトでどのように使用されているかに関する情報