ディレクトリ名?以前、こんな記事を書いた。runの引数はなんなのかhttps://hiro99ma.blogspot.com/2020/02/golanggo-run.htmlとりあえずmainパッケージを含んでいるディレクトリを指定しておけばいいんじゃないか、くらいで終わった。いえばimportなんかは基本的にsrc以下からのパスで書いていたはずだ。"github.com/hirokuma/gogo/cmd"、とか。mainパッケージを含んでいるディレクトリを書くということであれば、cmdディレクトリの中がmainパッケージになっていて、どれかのgoファイルの中にmain()があるんだろう。いつも「mainパッケージ」と呼んでいるが、よく考えれば正式な名前は「github.com/hirokuma/gogo/cmd/mainパッケージ」なのだろうか?runの引数は実行できれば良かったのだが、importとなるとまた話が変わってくることに気付いたのだった。Languagehttps://golang.org/doc/code.html読む前の注意点。set1.13より古い場合はアーカイブ参照だ。ページの最終更新日が書いてあると助かるのだが、載ってなさそうだ。google検索からすると、2020年1月13日みたいだ。翻訳するなら自動でもよさそうなので、気がついたところだけ抜粋しよう。パッケージ、リポジトリ、モジュールたぶん、ファイル単体を別とすれば、パッケージが最小単位リポジトリは1つ以上のモジュールを含む通常、リポジトリのルートにある1つのモジュールが含まれるgo.modとディレクトリのことが書いてあるが、なんか分かりづらいぞ。together.パッケージの単位は同一ディレクトリなのね。pathってことは、importに書いているあれはパスの方なのね。pathは、パスといっても純粋なディレクトリじゃなくて、ディレクトリ構造+パッケージ名、なのかよし、なんとなくわかった!わかったんじゃないだろうか。コードの書き方に抜け道(コンパイルエラーにならず上記の書き方にしない方法)はあるのだろうが、上記の書き方をしておけば悪くないということだ。C言語の時は使用期間が長いこともあり、自分でなんとなくルールを決めていった。Java言語ではディレクトリ構成も含めてきっちり決められていたので、その通りにやりつつも自由度がないなあ、と思った。その中間くらいなのかな。golang[vscode]vscodeとWSLとgolang仕事でもvscodeを使っているが、それはLinux上で動かしている。家で使う場合は、VirtualBox上にLinuxを立ち上げ、その環境で動かしている。Linuxでやっていて、vscodeを使っていた。golangであればWindowsでも使えるので、そっちの方が軽いだろう。それに、Linux環境も併用したいなら、WSLを使えばよい。いうわけで、vscodeはWindowsで、それ以外の環境はWSLで作ろうとした。WSLでは行われなかったのだ。env"ができない、みたいなことを言われるのだ。これは・・・Windows側にgoのバイナリが入っていないからか?と思ったら、単にWSL側の環境変数にgoのぱすをとおしていなかっただけだった。repositoryした方だったからか入っていなかった。PATHに追加すれば、インストールもできました。わからないが、gopkgsのインストールは失敗したので手動でインストールした。OUTPUTタブに失敗したコマンドが出てくるので、助かるね。."とすると\\wslの状態で立ち上がる。."で立ち上がってくれるかと思ったが、こちらは最後に起動したremote状態がWSLであれば、WSLで起動しているようだ。vscodeを複数開くと、最初のウィンドウサイズは保存してくれているサイズになるが、2枚目以降は強制的に画面の4分の1くらいになるようなので、最初からWSL状態で立ち上がってくれるのは助かる。コマンドラインから選択できるようであればショートカットを作っておくのだが、まあよかろう。Codeのナビゲーション部分(と呼ぶのか?)に、ファイル一覧を表示する"Explorer"がある。Editors"はsettings.jsonで非表示にできるようになっていたと思う。"explorer.openEditors.visible"だったと思う。Editorsの項目が増えて、その下に表示されるディレクトリ表示の位置が下がってしまうからだ。たたむこともできるのだけど、たたむくらいだったら非表示でいいか、と。Editorsが表示されていた。したらいいんじゃんろうかと触っていたら、コンテキストメニューで設定できるようになっていた。以前からできていたのかもしれないが、気付かなかった。Tools2020/02/23[golang]mutexもあるいかんいかん、golang気を抜くと学習を忘れてしまう。気を抜くとgolang自体忘れかねない。goroutineをちょっとだけやったが、そのときはデータの受け渡しにchanを使った。スライスを渡せる以上、メモリの共有もできるということだ。セマフォなりmutexなりの機構があるはずだ。Qiitahttps://qiita.com/mrasu/items/7531a5a28e9fda77aa5e#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%ABまあ、mutexはありがちだからよいとして、WaitGroupというものがあるそうだ。WaitGroupは「Addした回数Doneされるまで待ち続ける」という命令を書けるようにした仕組みです。Wait()があって、関連するオブジェクトをAddするとかいうものではなく、単にカウントだけの管理をしているようだ。ちなみにDone()は、Add(-1)になってる。いって自分で好きな負の値を書いていくのは良くない気がする。race.ReleaseMerge()は1回だけだし。いや、そもそもrace.Enableとかやってるけど、raceってWaitGroupオブジェクトごとに持ってるんじゃなくて、importしてるからグローバルな値よね?・・・race.Enableはconst値じゃった。golangのソースコードに慣れていないのだが、データの持ち方としては、こんな感じだろうか。関数内で宣言したスタックとかmakeした変数goroutineで共有するなら、グローバル変数やmakeした変数がよかろう。関数の引数は、元がどうやって宣言されているかによるから、なんともいえんな。いうわけで、簡単にグローバル変数を試すことにした。mutexの話をしているはずなのに、グローバル変数を試すことになるとは。55main関数は、mainパッケージに置く。mainパッケージに置いたグローバル変数は、mainパッケージの担当だろう。ex5パッケージからはmain.MainValにアクセスできなかった。逆はできるので、言語仕様だろうか。パッケージにpublicなグローバル変数を用意するよりは、getter/setterなんかでアクセスさせた方が安全な気はするが、言語的にできないのとは違う。ディレクトリ名をmainにしなかったせいか?しかし、実行ファイルをいくつか作りたい場合はcmd以下にディレクトリを作ろう、というのが推奨だったと思う。cmd/ex5/mainなんかにしてみたが、ダメだ。main関数があるとダメなのかと思ったが、そうでもない。golang2020/02/16[golang]配列はデータまるまる値渡し前回の続き。前回はスライスだけだったので、今回は配列をやろう。ちなみに、前回のスライスで書いたバージョンはこうだ。14前回は要素数を空欄にしていたので、指定しただけなのだが、それで大きく結果が変わった。gogo()を呼んでいる内容が反映されていないので、コピー渡しされているのだろうか?ちょうどよい記事があった。Qiitahttps://qiita.com/ta_ta_ta_miya/items/593ed887f58b251c4fe2golanの関数引数は値渡しらしい。これはC言語もそうなのだが、配列についてはgolangの方がより値渡しになっているな。C言語の配列は、配列の変数名だけだとアドレスを返す。配列の中身は、そのアドレスから始まるメモリに書かれている。ポインタ変数の場合は、そのアドレスにはポインタが指すアドレスが書かれている。golangでも配列はそのアドレスからデータが書かれているのだろう。配列を「値渡し」すると、そのアドレスに書いてあるデータも含めてコピーされる。スライスの場合はC言語のポインタ変数みたいなもので、アドレスに書かれているデータがアドレスやサイズのデータなので、それをコピーして渡す。C言語っぽく配列を渡したかったらどうするかというと、スライスにすればいいそうだ。この辺は慣れるしかないな。いかんいかん、ちゃんとスライスにすればOKなのかどうかを確認していなかった。EditorsのSow/Hideがコンテキストメニューになった[golang]mutexもある[golang]配列はデータまるまる値渡し[golang]スライスと配列。