目次

Go言語とは

Go言語はGoogleによって開発されているプログラミング言語で Linux、Mac、Window 等の主要OS 及び Android、iOS上でも動作する。(2016年現在)
※ Google App Engine でもサポートされている。

インストール

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

Mac の場合

Homebrew でのインストールが可能

brew install go

※パッケージを落としてインストールする場合は https://golang.org/dl/ から取得

インストール時に言われた通りにPATHを通す。
$HOME/.bash_profile

export GOPATH=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin

Hello World

hello.go

package main

import "fmt"

func main() {
  fmt.Printf("Hello, World\n")
}

実行

go run hello.go

環境変数

環境変数説明
GOROOT開発ツールのインストールPATH
GOPATHワークディレクトリのPATH
GOOSビルドした実行ファイルを実行させるOS
GOARCHビルドした実行ファイルが実行可能なアーキテクチャ

基本的な構文など

TODO:

パッケージ

  • 自身のパッケージは package で宣言する。
  • 利用するパッケージは import で宣言する。
  • main以外のパッケージと格納ディレクイトリは同じ名前にする。(慣例)
package main

import "fmt"

func main(){
    fmt.Println("Hello World")
}

複数 import は以下のように記述する事も可能

    :
import (
    "fmt"
    "encoding/json"
)
    :

変数

  • 変数は var で宣言する。
  • 初期値を指定した場合は型指定は省略できる。
  • ローカルスコープの変数に限り、「変数名:= 式」で宣言する事も可能。(型宣言は指定不可)
// 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) 
}

データ型

TODO:
TODO: 数値
TODO: 文字列
TODO: []byte
TODO: []rune
TODO: 真偽値
TODO: 配列/スライス
TODO: マップ
TODO: ポインタ
TODO: 構造体
TODO: nil

型宣言

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)
}

条件分岐

if による条件分岐

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 による条件分岐

他の言語と同様に 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)
    }
}

関数

  • 関数は func で宣言する。
  • 他のパッケージに公開する関数は、頭の1文字目を大文字にする。
  • 複数の戻り値を返却する事も可能。
  • 可変長引数を受け取る事も可能。
  • 関数の終了処理を defer で定義する事ができる
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")
}

インターフェース

TODO:

例外処理

TODO: panic と recover

ビルド

TODO:

Goルーチン

Goルーチン を参照

ブラウザ上でGoのソースを実行可能な環境

Go Playground
https://play.golang.org

A Tour of Go
https://tour.golang.org


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS