環境: Mac OS X El Capitan
Go 言語を Homebrew でインストール
$ brew install go
$ which go
/usr/local/bin/go
$ go version
go version go1.6 darwin/amd64
Go 言語で hello, world してみる
ソースコード。
$ cat helloworld.go
package main
import fmt "fmt" // 入出力フォーマットを実装したパッケージ
func main() {
fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n")
}
実行結果。
$ go run helloworld.go
Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
Go 言語で Web サーバを起動してみる
ソースコード。
$ cat webserver.go
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Go による Web サーバを起動。
$ go run webserver.go
他のターミナルからアクセスしてみると、ちゃんと Web サーバが動作している。
$ curl http://localhost:8080/monkeys
Hi there, I love monkeys!
$ curl http://localhost:8080/programmers
Hi there, I love programmers!
cannot find package エラーが発生
Web サーバの実装は Codelab: Webアプリケーションを書いてみよう - golang.jp に載っているソースコードを参考にしたけど、そのまま実行するとエラーになってしまった。
ソースコード。
$ cat webserver.go
package main
import (
"fmt"
"http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
実行したら、エラーに。
$ go run webserver.go
webserver.go:6:2: cannot find package "http" in any of:
/usr/local/Cellar/go/1.6/libexec/src/http (from $GOROOT)
($GOPATH not set)
import で "http" を指定するのではなく、 "net/http" を指定したらエラーは無くなった。もしかしてバージョンが上がってパッケージの構成が変わったんだろうか。 $GOPATH を指定する必要は無かった。
Go環境変数
go env コマンドで、 Go での環境変数を確認できる。
envはGo環境情報をプリントします。
デフォルトではenvはshellスクリプト(Windowsではバッチファイル)として情報をプリントします。引数として1つ以上の変数名が与えられた場合、envは順番に一行ずつその名前の変数の値をプリントします。
go - The Go Programming Language
go env を実行した結果。
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.6/libexec"
GOTOOLDIR="/usr/local/Cellar/go/1.6/libexec/pkg/tool/darwin_amd64"
GO15VENDOREXPERIMENT="1"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"
$GOPATH について
Java でいうところのクラスパスみたいなものらしい。
GOPATH環境変数
Go pathはインポート文を解決するために使用されます。go/buildパッケージに実装、ドキュメントされています。
GOPATH環境変数はGoのコードを探しにいく場所をリストアップします。Unixでは、値はコロンで区切った文字列です。Windowsでは、値はセミコロンで区切った文字列です。Plan 9では、値はリストです。
go - The Go Programming Language
go help gopath で、 $GOPATH についてのヘルプを表示できる。でもまあ英語なので全部読むのはしんどい。
$ go help gopath
The Go path is used to resolve import statements.
It is implemented by and documented in the go/build package.
The GOPATH environment variable lists places to look for Go code.
On Unix, the value is a colon-separated string.
On Windows, the value is a semicolon-separated string.
On Plan 9, the value is a list.
参考資料。
古い資料もあるので注意。
- The Go Programming Language
- Go言語のインストール - golang.jp
- Goプログラミング言語のチュートリアル - golang.jp
- Golang Macへのインストール〜Homebrewを使って〜 - Qiita
- あなたがGOROOTを本当に設定しなくていい理由 · Androg
- GOPATH は適当に決めて問題ない - Qiita
tags: go
Posted by NI-Lab. (@nilab)