RandomThoughts

RandomThoughts

Go

Contents:
  1. モジュール
    1. パッケージレイアウト
  2. lensmとディスアセンブル
  3. Generics
  4. リフレクション
  5. コードを書き始めるセットアップ
  6. struct embedding
  7. 引数つきの配列初期化
  8. lorcaとWails
  9. ASTのノード的な表現
  10. Go学習メモ
    1. A Tour of Goをやっている 2024-12-23 (月)
    2. Sliceの終わりまで 2024-12-24 (火)
    3. Tourが終わったのでTutorialを少し進める 2025-01-08 (水)

技術的なメモ

go言語、golangなどと呼ばれる。

モジュール

パッケージレイアウト

モジュールと関連した話題。

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

使う側

~Tはunderlying typeがTな型全部。

Constraints周りの説明

いまいちどういうconstraintsがあるのか良く分からないが、実はあんまりないのかもしれない。

内部解説

リフレクション

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とかを見たりする。