golangで cの#includeみたいなことをやりたいだけなのに、酷く苦労した話

変数や構造体などを一箇所に集めておいて、ソースコードから、#include "include.h" みたいに使うのは、Cの定番ですが、これだけのことをGoでやりたいだけなのに、酷く苦労しました。

大切なのは、ソースコードと違う場所に、そのインクルードファイルみたいなものを置きたい(×ソースコードの配下のディレクトリ)でなく、複数のgoのプロジェクトから共通して使いたい。

まあ、こんな感じです。

(人生最初のアイビスペイント+iPadの手書きです)

ソースファイルは、こんな感じです。

include.go

package include // この名前が、mail.goで使われるので覚えておいて下さい

type Person struct {  //  先頭大文字
	FirstName string // 先頭大文字 
	Age       int // 先頭大文字
}

main.go (これは、src,src2の両方で使っています)

package main

import (
	"fmt"
	"m/include"
)

func main() {
	var mike include.Person  // この "include.Person"という変数名が特徴です
	mike.FirstName = "Mike" // あとは構造体の属性を持ってくるだけ(先頭大文字を忘れないように)
	mike.Age = 20           // 同上
	fmt.Println(mike.FirstName, mike.Age) //=> Mike 20
}

で、ここからが重要なんですが、例えばsrcディレクトリの中で実行すると

PS C:\Users\ebata\dummy\go_test2\src> go run .
go: cannot find main module, but found .git/config in C:\Users\ebata
to create a module there, run:
cd ..\..\.. && go mod init

てなことを言われますので、include, src, src2の上のディレクトリで、

go mod init m // "m"でも、"mm"でも、"mmm"でも、かまわん

を実行すると、go.modができます。中身はこれだけです。

go.mod の中に、includeが書き込まれているとか、そういうことはないようです(どうなっているか分かりません)が、とりあえずsrcに移動して、main.goが動きました。

2022/10,江端さんの技術メモ

Posted by ebata