環境: 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.

参考資料。

古い資料もあるので注意。

tags: go

Posted by NI-Lab. (@nilab)