タグ「Go」が付けられているもの

A Tour of Go の split関数

  • 投稿日:
  • by
  • カテゴリ:

A Tour of GoというGo言語のチュートリアルがあるのでそれを見ていたら、サンプルコードにsplit関数というのがあった。 split関数に17という値を渡すと、7と10の二つの値を戻り値として返す関数なのだが、1の位と10の位に分けられたの!?と驚いたので整理。

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

上記関数に17を与えると x = 7, y = 10 のそれぞれの値が返る。 x は4/9を掛けているだけで、yはxを引くだけ。なんでそれで7と10に分けられるのか。。 単純に計算すると以下の通り。

x = 17 * 4 / 9
  = 68 / 9
  = 7 余り 5
  = 7 (intなので切り捨て)

y = 17 - 7
  = 10

ふーむ。

一つ目のxの式をyの式に代入してみる。

y = sum - sum * 4 / 9
  = sum * 5 / 9

sum = 17
y = 17 * 5 / 9
  = 9 余り 4
  = 9(intなので切り捨て)
  != 10

一致しない。 今度はsumの式として二つ目の式を一つ目の式に代入。

x = ( x + y ) * 4 / 9
5x = 4y

ふーむ。 やはり。。単に4:5くらいに分けているだけで、intで計算しているので一方の値はもう一方の値を引いた値にしているというだけか。。 17だとたまたま10と7という意味ありげな分かれ方をするというだけね。

Goはじめ

  • 投稿日:
  • by
  • カテゴリ:

Goを触ることにしたので、色々なドキュメントを読んだメモを書こうと思って始めたものの二つで力尽きたので続きはまた別に。

Go のインストール

tarボールを展開するだけでとりあえず終わり。 GOPATH環境変数は設定しない場合は/goが設定される。設定しなくても良い。 /go以外にしたい場合に設定すれば良いとのこと。

インストールした後に、普通設定すべきこととしてパスの設定がある。

export PATH=$PATH:$(go env GOPATH)/bin

https://golang.org/doc/install

Go の基本

以下のURLに基本が書いてあるのでとりあえずこれを読むのが良さそう。

https://golang.org/doc/code.html

$GOPATH(~/go/)が唯一のワークスペース。複数作らないで一つにする。と書いてある。 Go以外の言語では、プロジェクト毎にワークスペースがあるけれども、Goでは単一のワークスペースであることが違い。 そこ代わりに、単一のワークスペースに複数のリポジトリが含まれており、さらにそれらは複数のパッケージを含む。 リポジトリというのはバージョン管理の対象の単位。.gitディレクトリが存在するディレクトリのこと。 パッケージとは、ディレクトリ一つ毎にパッケージ一つであり、例えばパッケージ毎に異なる実行ファイルを提供する。 パッケージは複数のソースファイルを含んで良いが、ディレクトリは単一。

ワークスペースには、src/とbin/というディレクトリがあり、src/配下に複数のリポジトリを配置する。bin/には、それらの実行ファイルを配置する。

ワークスペースにはシンボリックリンクは使うべきではないとのこと。 現在のワークスペースは以下のコマンドで確認できる。

go env GOPATH

パッケージパス

自分で作ったGoソースファイルや誰かの作ったパッケージ等は、$GOPATH/src/の下のディレクトリパスを使って指定する。 fmtパッケージのような標準パッケージは短い。自分でパッケージを作成するときは将来的にも標準パッケージと同じにならないように注意する必要がある。ただし、github.comで公開するような場合は、github.com/ユーザ名 がそのベースパスとなり、その下にパッケージ名が続くようになる。

build and install

ソースファイルをビルドしてインストールするには、 go install コマンドを使う。 パッケージパスを引数に指定するか、パッケージディレクトリにcdしてからコマンドを実行する。

go install github.com/hseiyo/hello
or
cd $GOPATH/src/github.com/hseiyo/hello
go install

installできたコマンドは実行可能。 GOPATH/binをPATHに追加してあればコマンド名だけで実行可能。 go build コマンドを代わりに使うと、ビルドして実行ファイルは作成されるが、$GOPATH/binにはコピーされずにパッケージディレクトリに作成される。これも実行可能ではあるが、このパッケージが実行コマンドではなくライブラリの場合にはinstallではなく、buildを実行してパッケージディレクトリにバイナリファイルを置いておく。 他のソースファイルからimportする際に利用される。

パッケージ名

ソースファイルには必ず以下のようにようにしてパッケージ名を指定する。 同一のパッケージに所属するソースファイルはすべて同じパッケージ名を指定する。これは必ず指定が必要。 ディレクトリ名と同じ文字列をパッケージ名として指定する。

パッケージ名はほかのパッケージと同じものを利用しても問題ないが、インポートパス名は異なる必要がある。

テスト用ソースファイル

_test.goで終わるファイル名のファイルはテスト用に使用する。

testingパッケージをインポートした上で、Test<関数名>(t *testing.T)という関数を定義する。 そして以下のコマンドを実行する。

go test github.com/hseiyo/hello
or
cd $GOPATH/src/github.com/hseiyo/hello
go test

go get

例えば以下のコマンドは、リモートからファイルを取得(ダウンロード)して、ビルドしてインストール($GOPATH/bin/へのコピー)を行う。

go get github.com/hseiyo/hello

ただし、既に同じ名前のパッケージが存在している場合には、go install と同じ意味となる。