Go言語はGoogleによって開発されているプログラミング言語で Linux、Mac、Window 等の主要OS 及び Android、iOS上でも動作する。(2016年現在)
※ Google App Engine でもサポートされている。
https://golang.org/doc/install#install
インストール時に言われた通りにPATHを通す。
$HOME/.bash_profile
export GOPATH=/usr/local/opt/go/libexec export PATH=$PATH:$GOPATH/bin
hello.go
package main import "fmt" func main() { fmt.Printf("Hello, World\n") }
実行
go run hello.go
環境変数 | 説明 |
GOROOT | 開発ツールのインストールPATH |
GOPATH | ワークディレクトリのPATH |
GOOS | ビルドした実行ファイルを実行させるOS |
GOARCH | ビルドした実行ファイルが実行可能なアーキテクチャ |
package main import "fmt" func main(){ fmt.Println("Hello World") }
複数 import は以下のように記述する事も可能
: import ( "fmt" "encoding/json" ) :
// aを宣言 var a int // 初期値を指定してbを宣言 var b int = 1 // 初期値を指定してcを宣言(型指定を省略) var c = 0 // 複数の変数を宣言 var d1, d2 int var e1, e2 int = 1, 2 var f1, f2 = 1, 2 // ローカル変数の宣言例 func main(){ // aを宣言 var a int a = 1 // bの宣言と初期化(型指定は不可) b := 1 }
定数は const キーワードで宣言する。
package main import "fmt" const c1 string = "const1" func main(){ const c2 string = "const2" fmt.Printf("c1: %s\n", c1) fmt.Printf("c2: %s\n", c2) }
type を使用する事で、型に別名を付けて新しい型を作成する事ができる。
package main import "fmt" type MyInt int type MyStruct struct { Id MyInt Name string } func main(){ x := MyStruct{Id: 100, Name: "Taro"} fmt.Printf("Id: %d\n", x.Id) fmt.Printf("Name: %s\n", x.Name) }
package main import "fmt" func main(){ x := 3 if x == 1 { fmt.Println("x is 1") } else if x == 2 { fmt.Println("x is 2") } else { fmt.Println("others") } }
他の言語と同様に switch も使用できる。
ただし Java等と違って break を書く必要がない点が異なる。
逆に、次の case に遷移させたい場合は、fallthrough を使用する。
package main import "fmt" func main(){ x := 3 switch x { case 1: fmt.Println("x is 1") case 2: fmt.Println("x is 2") case 3: fmt.Println("x is 3") fallthrough default: // x = 3 の時だけここが実行される fmt.Println("others") } // 以下の書き方も可能 switch { case x == 1: fmt.Println("x is 1") case x == 2: fmt.Println("x is 2") case x == 3: fmt.Println("x is 3") } }
繰り返しは全て for で行う。
while や foreach は存在しないが、同等の処理を for のみで行う事が可能となっている。
package main import "fmt" func main(){ // 通常のforループ for i := 0; i < 5; i++ { fmt.Printf("i = %d\n", i) } // 疑似while x := 0 for x < 5 { fmt.Printf("x = %d\n", x) x++ } // 永久ループ y := 0 for { fmt.Printf("y = %d\n", y) y++ if y >= 5 { break } } // 配列要素分繰り返し(疑似foreach) array1 := []int{1,2,3,4,5} for i, val := range array1 { fmt.Printf("val[%d] = %d\n", i,val) } // マップの要素分繰り返し(疑似foreach) m := map[string]int{"k1": 1, "k2": 2, "k3": 3, "k4": 4, "k5": 5} for key, val := range m { fmt.Printf("val[%s] = %d\n", key,val) } }
package main import "fmt" // 通常の関数 func myAdd(a int, b int) int{ result := a + b return result } // 他パッケージに公開する関数 func MyAdd(a int, b int) int { return myAdd(a, b) } // 戻り値が2つの関数 func multiResult() (int, int){ return 1, 10 } // 可変長引数を受け取る関数 func multiArgs(a string, args...string){ // 関数の終了処理を defer で定義する事ができる defer func() { fmt.Println("multiArgs end!") }() fmt.Printf("a = %s\n", a) for i, val := range args { fmt.Printf("args[%d] = %s\n", i, val) } } func main(){ result := myAdd(1, 2) fmt.Printf("myAdd(1,2) = %d\n", result) x1, x2 := multiResult() fmt.Printf("multiResult() = %d, %d\n", x1, x2) multiArgs("a", "b", "c", "d") }
Goルーチン を参照
Go Playground
https://play.golang.org
A Tour of Go
https://tour.golang.org