2017/01/28

[勉]go (1)

しかさんに、Pythonからgoに変換する、というものを教えてもらった。
が、goなんて試して大丈夫だろうか?
Pythonを使ってから、Cに戻っても文字列をシングルクオーテーションで囲もうとしたり、セミコロンを付け忘れたりと、多少困ったことになっているのだ。

が、ソースファイルの一部を見て「あ、これはgoだね」くらいは言えるようになっておきたいというのはある。
Hello World程度はやっておこう。


まず、インストール。
Ubuntu on Windowsで試そうとしたのだが、困ったことに、なぜかgoがインストールされていた。
したっけ。。。最近、別の作業でインストールしたような気がしなくもない。

$ go version
go version go1.6 linux/amd64
$ ls -l /usr/bin/go
/usr/bin/go -> /etc/alternatives/go*

今日の時点では、最新版は「go1.7.5 (released 2017/01/26)」なので、aptでupdateしたり、purgeしてinstallし直したりしたが、そもそもpurgeしてもgoコマンドが使える。
なんなんだ、一体。。。

 

https://golang.org/doc/install#uninstall
goディレクトリを削除、という方法なのか。

$ ls -l /usr/bin/go
/usr/bin/go -> /etc/alternatives/go*
$ ls -l /etc/alternatives/go
/etc/alternatives/go -> /usr/lib/go/bin/go*
$ ls -l /usr/lib/go/bin/go
/usr/lib/go/bin/go*

たらい回しにされたが、/usr/lib/goディレクトリが本体のようだから、それを削除すれば良いことになるのかな。

そして、wgetでtar.gzファイルを取ってきて、tarで展開すると、goディレクトリが出てくる。
これを/usr/localに移動させて、/usr/local/go/binにPATHを通せばよい。

$ go version
go version go1.7.5 linux/amd64

~/.profileに追加するよう書かれているが、.profileを見ると~/.bashrcがあれば読込んでいるので、今回は.bashrcでよいだろう。

そして、/usr/local/go以外に置くのであれば、GOROOTを設定する必要があるらしい。
では、さっきまで/usr/lib/goに入っていたのだが、その場合はGOROOTは/usr/lib/goだったのだろうか。。。
gccなんかは、実行ファイルさえ動けば位置の設定などせずに使えるけど、ああはならなかったのだろうか?
あるいは、なにか便利なことがあるのかもしれない。

 

そしてGOPATHだ。
これを設定しておかないと、なんか、いろいろうまくいかなかった記憶がある。
今回は、~/Prog/golangにしておこう。
Progはシンボリックリンクで、lxssではなく普通の場所にしている。
テキストエディタを使うのは、lxss以下だとやりづらい。


https://golang.org/doc/install#testing

動作確認。
GOPATHを設定して、src/github.com/user/helloにhello.goというファイルを作るらしい。
なんだよ、github.comって。。。
変に反発して、~/Prog/golang/hello/hello.goという構成にしてみた。

$ go install hello
can't load package: package hello: cannot find package "hello" in any of:
        /usr/local/go/src/hello (from $GOROOT)
        /home/xxx/Prog/golang/src/hello (from $GOPATH)

ちっ。
$GOPATH/src以下にないとだめなんだ。
つまり$GOPATHの中には、binとsrcがいるということだ。

あらためて、~/Prog/golang/src/hello/hello.goという構成でやってみる。

$ go install hello
go build hello: /usr/local/go/pkg/tool/linux_amd64/link: read |0: interrupted system call

ん??
これ、前回もなったな。。。
確か、2回同じことをするとビルドできたような。

$ go install hello
$

できた。
・・・これでよいのか?

$ ls $GOPATH/bin
hello*
$ hello
Hello, world!

動いた。

$ file $GOPATH/bin/o
/home/xxx/Prog/golang/bin/hello: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, not stripped
$ ls -l$GOPATH/bin/hello
-rwxrwxrwx 1 root root 1642158 Jan 28 11:44 /home/xxx/Prog/golang/bin/hello*

意外と大きいな。

$ strip $GOPATH/bin/hello
$ ls -l $GOPATH/bin/hello
-rwxrwxrwx 1 root root 1028488 Jan 28 11:47 /home/xxx/Prog/golang/bin/hello*

まあ、static linkしているから、こんなもんか。
gccだと共有ライブラリを使うのがデフォルトだから、実行ファイル自体は小さくなるだろう。
Execution Modeというのが関係しそうな、しなさそうな。。。まあ、忘れよう。
Go Execution Modes - Google ドキュメント


動いたものの、気になるのはinterrupted system call。

go build command-line-arguments: read |0: interrupted system call · Issue #349 · Microsoft/BashOnWindows

uowの問題で、Build 15019では直るのだとか。
これがWindows Updateのようなものなのか、Anniversary Updateみたいなものなのかは、よくわからんな。

 

動かないことはないので、次回がいつになるか分からないが、そのときはもう少し見ることにしよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。