Go
Go
go言語、golangなどと呼ばれる。関連してFolangのリンクも張っておく。
- Tutorials - The Go Programming Language
- Go by Example
- The Go Programming Language Specification - The Go Programming Language
- research!rsc: Go Data Structures: Interfaces インターフェースの内部表現、割と良く見たくなるページなので。
- fmt package - fmt - Go Packages standard libraryのリファレンス、とりあえずfmtを貼っておく
- go - Go 処理系のソース。
- alecthomas/participle: A parser library for Go パーサーはこれが良い。
- Wails Go向けのElectron代替。
モジュール
- Organizing a Go module - The Go Programming Language
- Import same package name or Aliasing while importing packages in Go (Golang) - Welcome To Golang By Example importでのエイリアス
パッケージレイアウト
モジュールと関連した話題。
pkg, cmd, internalに分けるのがスタンダードっぽいか。
lensmとディスアセンブル
使い方が良く分からなかったのでメモ。
$ go build -o hello_generics hello_generics.go
$ lensm -filter main hello_generics
最適化を切りたければ以下。(lがno inline、Nが最適化無効)
$ go build -gcflags "-N -l" -o hello_generics hello_generics.go
Generics
使う側
- Go by Example: Generics
- Tutorial: Getting started with generics - The Go Programming Language constraintsの追加の仕方がわかる
~Tはunderlying typeがTな型全部。
Constraints周りの説明
- The Go Programming Language Specification#Type_constraints 使う側の仕様的な解説
- cmp package - cmp - Go Packages cmpにOrderedというのがある
- constraints package - golang.org/x/exp/constraints - Go Packages 2025年現在でもexperimentsな奴で、predefinedな奴は見つけた。(これがまだexperimentalなの!?)
- All your comparable types - The Go Programming Language comparableは特別らしい。
いまいちどういうconstraintsがあるのか良く分からないが、実はあんまりないのかもしれない。
内部解説
- The generics implementation of Go 1.18 • DeepSource 内部解説ブログ
- proposal/design/generics-implementation-dictionaries-go1.18.md at master · golang/proposal 公式ドキュメント
リフレクション
The Laws of Reflection - The Go Programming Language
Elemがなんなのかはよく分からないが、NumFieldでフィールドの個数、Fieldでフィールドが取れそうか。
コードを書き始めるセットアップ
go mod initに何を書くかよくわからんな、と思ったが、「go mod init github.com/karino2/レポジトリの名前」で良さそう。
また、go buildは同一ディレクトリ内の.goファイルをビルドしてくれるっぽい。>go command - cmd/go - Go Packages
struct embedding
Go by Example: Struct Embedding
IRのツリー作る時などの、Nodeを先頭に置くとメソッドが使えるという機能。
引数つきの配列初期化
starlark-goのコードを見ていたら以下のようなコードがあった。starlark-go/internal/compile/compile.go at master · google/starlark-go
const (
AMP Opcode = iota
APPEND
// 以下省略
)
var opcodeNames = [...]string {
AMP: "amp",
APPEND: "append",
// 以下省略
}
これで、opcodeNames[AMP] などのように並ぶらしい。
どうも配列の要素の前に定数でインデックスを指定出来るっぽいんだが、ドキュメントで該当場所は見つけられなかった。
以下みたいなコードは動く。
const (
HOGE int = iota
IKA
)
func main() {
s := [...]string{
HOGE: "hoge",
// IKA: "ika"
3: "ika",
}
fmt.Println(s)
}
ちなみにドット3つはコンパイル時に要素数に展開されるらしい。
lorcaとWails
Electron的な事をやりたい、みたいな話。
WailsはElectronの代替としてより本格的なもの。出来上がったものもMacではちゃんとapp bundleになる。 ただgo installとかで結果が入る感じにはならない。
lorcaはChromeのデバッグなんちゃらの機能を使って動くとの事で、Chromeが立ち上がる。 ただ出来上がったものは普通にgo install出来そう。
mdvcatを移植してみた>karino2/mdvcat_lorca: lorca porting of mdvcat.
こういうのはこれでいいかもな。
ASTのノード的な表現
Exprのstructを定義する、みたいな時に、空のメソッドをインターフェースにいれる事で表現するイディオムがあるっぽい。 starlark-goのExprに以下のようなコードがあった。starlark-go/syntax/syntax.go at master · google/starlark-go
type Expr interface {
expr()
}
func (*BinaryExpr) expr() {}
func (*CallExpr) expr() {}
// 以下略
こうやって構造体がExprである事を表現しているっぽい。 別にexprメソッド無くても動きそうではあるが。Stmtとかも同様の事をやっている。
Go学習メモ
やった事をどこかに書きたい時にここに書く。
A Tour of Goをやっている 2024-12-23 (月)
久しぶりにgolangでも触るか、と思い、とりあえずA Tour of Goをやっている。 割と短いのだが、一気に最後までは終えられないんだよなぁ、毎回。
今はif文のあたりで休憩。
Sliceの終わりまで 2024-12-24 (火)
Sliceのあたりは毎回ちょっと詰まるな。 最後まで終わったところで休憩中。
構造体とか関数あたりまで飛ばしてしまってもいいのだが、 rangeとかifの条件の前に文書けるのとかswitch周りとか細々と忘れている事があるので結局全部見ている。
Tourが終わったのでTutorialを少し進める 2025-01-08 (水)
複数モジュールの開発とかgenericsとかを見たりする。