Goのメモ

Goのパッケージ名の衝突回避

How to import and use different packages of the same name in Go language? - Stack Overflow

Goはパッケージ名が自由に付けられるので簡単に衝突する。この場合、import文で別名を付けられる。

Goのmoduleの解説

GoBlogのモジュール解説記事を翻訳して下さった方がいる。ありがたい。

The Go Blog - Using Go Modules / Go Modulesを使う(和訳) - Qiita

これでpackageのバージョン管理にオフィシャルな手段ができた。自分で作るプログラムにもきちんとversionのtagを貼らないといけないかも。

gopkg.inもこれまで利用されてきた訳だけれどもソースのimportにversionを書くのはもう、使われないだろうか?

gopkg.in - Stable APIs for the Go language

GoDocの書き方

本家blogに説明あるけどあまり役に立たず。

Godoc: documenting Go code - The Go Blog

歴史的経緯なんでしょうね。これ古いし。 で、Exampleについて別に記事がある。

Testable Examples in Go - The Go Blog

で、割と良い感じに一発で全貌がわかる感じのがこれ。

godoctricks - GoDoc

しかしGitHubにGoのコードを上げるだけでGoDocがgodoc.orgに生成されるって素晴しい仕組みですよね。

The Go PlaygroundでGoのコードをシェアできる

The Go Playground

A Tour of Goで利用されているブラウザ上でGoを編集、即実行可能な環境。良く見たら誰でもコードを書いて共有可能な模様。shareボタンを押すとURLが表示される。ソースも公開されていて、使っても良いよと。ただ自身のサイトで使うなら一度、連絡してねともある。

Goにはgotoがある :-)

tourでは紹介されていないがGoにはgoto文が存在。なぜ今さらと思う人が多いのか検索すると色々な所で議論されている。

Why does Go have a "goto" statement - Stack Overflow

Google グループ

決定的な回答はないけどgoのsrcでも随分と使われている模様だ。Linusだってgotoはtoolで有効に使えば役に立つと仰っている模様。

raw

Goでダブルクォートでなく、バッククォートで文字列を作ることでダブルクォートや改行を含む文字列が作成可能。go-flagsでコマンドオプションの定義を文字列で行っているのだけれどこれが利用されている。これ普通にstructでは駄目だったのだろうか? 文字列にすることで改行を防いだのだろうか?

漢字コードの変換

普通にテキストファイルを別のencodeに変換するならこの記事が良さそう。特にコメントまで読むこと。

Golang による文字エンコーディング変換 - Qiita

自分が今欲しいのは特殊なケースで小さなbyte列の文字列のコードを変換する場合。それにはこちらのほうが良さげ。

golang, convert UTF-16 to UTF-8 string · GitHub

こちらもコメントの最後が正解例。

vimでgo

2年前に使った時に利用したvim-goだがこちらのチュートリアルに大変、お世話になった。

GitHub - hnakamur/vim-go-tutorial-ja: Tutorial for vim-go Japanese translation

最近は似た名前の全く別の物がある模様。govim :-)

GitHub - myitcv/govim: govim is a Go development plugin for Vim8, written in Go

こちらはvimプラグインをGoで書くという意欲的、かつ試験的な物との話。Language Server ProtocolというどんなエディタもIDEにしてしまうプロトコルを用いる支援サーバ、(Goの場合、gopls)を用いてvimIDE並の使いごごちにする模様。

go-vimvimのバージョン要件も高くv8.1.1158 が必要だという。WSLのUbuntu Bionicでも8.0だったりするので結構入れるだけでも手数はかかる。まぁ、makeするだけだけど。

gopls · golang/go Wiki · GitHub

何か色々とドキュメントを見てもまだαだと強調しているので本当に貢献するくらいの気持でないと大変かも。

GoCon 2019

土曜日に開催されたらしい。まとめて下さった方がいる。

「Go Conference 2019 Spring」に参加してきた! - Fumiエンジニアブログ

入門者レベルの自分と比べるとどの発表も笑っちゃうくらいレベルが違う。メモリ構造とalignmentの話が個人的にツボで大変勉強になった。またコンパイラに手を入れている記事もレベル感が違い過ぎて笑いが出た。

Quizが面白い。

Go Quiz - Google スライド

全部、わからなかったw 一応、Playgroundで流してみて実行を確認。こんなのコンパイル通るのかよという感じ。解説がないので理解が合ってるかわからないが、

  • 問1は関数の多重定義がエラーにならないのが衝撃。実行順がinit*3, mainでAAAA?

  • 問2は配列に対してlenはともかくcapが通るのか悩んだが通る。アドレスでもがいらない。試しにlenとcapのaにを付けたが大丈夫

  • 問3は鍵が8進数で0から最大の8(010)までのsliceになる模様。定義が無い所はゼロ値になる。mapでなくてもこのような定義ができるとは

Java Quizも苦手だったけど、こういう文法の隅を突くような問題は難しい。実際のプログラムでは絶対に書かない、よね? :-)

Goでバイナリ処理

メモ。間違いなく使う。 Go でバイナリ処理 - Qiita

GoもJavaと同じくbufferedなreaderがある模様だけれど、bufferingをよしなにやってくれるのだろうか。

Goでのコマンドの美しい作り方

GoConで素晴しい発表があった。

We want AWESOME CLI tool & development - Speaker Deck

有り難い。今、まさにこのようなまとめが欲しかった。100回くらい読みたい。

同じ方のblogのほうでもまとまっていた。 Go の便利な CLI パッケージの紹介 · micnncim

標準ライブラリのflagsもgo-flagsもちょっと違うなぁと思っていたら選ぶのに迷うくらいライブラリが紹介されている。この中から自分のベストを探すだけでも大変そう。