go言語、golangなどと呼ばれる。
モジュールと関連した話題。
pkg, cmd, internalに分けるのがスタンダードっぽいか。
使い方が良く分からなかったのでメモ。
$ 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
使う側
~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
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つはコンパイル時に要素数に展開されるらしい。
Electron的な事をやりたい、みたいな話。
WailsはElectronの代替としてより本格的なもの。出来上がったものもMacではちゃんとapp bundleになる。 ただgo installとかで結果が入る感じにはならない。
lorcaはChromeのデバッグなんちゃらの機能を使って動くとの事で、Chromeが立ち上がる。 ただ出来上がったものは普通にgo install出来そう。
mdvcatを移植してみた>karino2/mdvcat_lorca: lorca porting of mdvcat.
こういうのはこれでいいかもな。
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とかも同様の事をやっている。
やった事をどこかに書きたい時にここに書く。
久しぶりにgolangでも触るか、と思い、とりあえずA Tour of Goをやっている。 割と短いのだが、一気に最後までは終えられないんだよなぁ、毎回。
今はif文のあたりで休憩。
Sliceのあたりは毎回ちょっと詰まるな。 最後まで終わったところで休憩中。
構造体とか関数あたりまで飛ばしてしまってもいいのだが、 rangeとかifの条件の前に文書けるのとかswitch周りとか細々と忘れている事があるので結局全部見ている。
複数モジュールの開発とかgenericsとかを見たりする。