Go

Go言語はじめました その2

はじめに

前回は環境構築的なことしか行ってなかったので、今回は文法的なことをやっていこうと思います

環境

スクリーンショット 2018-04-04 11.24.37.png

実行とビルド

hello_world.go
package main

import "fmt"

func main() {
    fmt.Println("HelloWorld")
}

実行

go run hello_world.go

まぁ普通にHelloWorldと出力されます

ビルド

go build hello_world.go

hello_worldというUNIX実行ファイルが同ディレクトリにできました
そして以下のコマンドで実行できます

./hello_world

実行するとHelloWorldと出力されます
なんかJavaのjavacコマンドを思い出しました

ぶっちゃけ今のところ go runで実行するのとgo buildでビルドしてから実行することの利点がイマイチわかっていません(追々理解していこうと思います)

基本文法


package main

import "fmt"

func main() {
    //宣言
    var num int
    var str string

    num = 0
    str = "hoge"

    fmt.Println(num, str)

    //変数初期化
    var num2 = 1
        num3 := 2
    var str2 = "go"

    //定数初期化
    const num4 = 3

    fmt.Printf("num2:%d num3:%d num4:%d str2:%s\n", num2, num3, num4 ,str2)
}
0 hoge
num2:1  num3:2 num4:3str2:go

変数は varで定数はconstなんかjavascriptっぽい気がする
今までやってきた言語はC, Java, Pythonですがまあ少し違うくらいでしたですがnum3 := 2は初めてみました
定数では :=を使用することができません

Why fmt?

出力するのは謎のfmtというパッケージからPrint関数を呼び出して出力します
公式ドキュメントより

Package fmt implements formatted I/O with functions analogous to C's
    printf and scanf. The format 'verbs' are derived from C's but are
    simpler.

ざっくり言うと
C言語に似たprintfscanfといった関数を持っていて、 C言語から派生しているが単純化されている

ちなみにドキュメントはgodocと言うドキュメント閲覧ツールを使用して見ました

godocのインストール
go get golang.org/x/tools/cmd/godoc
fmtのドキュメントを見るとき
godoc fmt

godocに続けてパッケージ名を入力するとそのドキュメントが閲覧できます

型の種類

  • 真偽値型 
  • 数値型
  • 文字列型
  • 構造体型
  • ポインタ型
  • マップ型
  • 関数型
  • チャンネル型
  • スライス型

C言語で挫折したポインタがあるだとΣ( ̄ロ ̄''lll)
構造体も懐かしいC言語でやった記憶がある(覚えているとはいっていない)
チャンネル型とスライス型はなんだ?とりあえず公式チュートリアルの途中なので今回はパスします

パッケージのインポートと関数

package main

import (
    "fmt"
    "math"
)

func showPi() {
    fmt.Println(math.Pi)
}

func add(x int, y int) int {
    return x + y
}

func main() {
    showPi()
    fmt.Println(add(4, 12))
}

複数のパッケージをインポートする際はimport後ろに()内に記述します

引数のない関数showPimain関数とそんなにからわない印象でした
引数と戻り値のある関数 addはパッと見た感じC言語の戻り値の型を後ろに移動した感じかなと思いました

複数の戻り値

package main

import (
    "fmt"
)

func change(x, y string) (string, string) {
    return y, x
}

func main() {
    a, b := change("Hello", "World")
    fmt.Println(a, b)
}

関数の引数が2つ以上で型が同じなら (x, y string)と省略できる
(string string)で戻り値も複数返せます

naked return


func hanbun(num int) (x, y int) {
    x = num / 2
    y = num % 2
    return
}

func main() {
    fmt.Println(hanbun(5))
    a, b := hanbun(8)
    fmt.Println(a, b)
}
2 1
4 0

戻り値に変数名をつけることでreturnの後にリターンステートメントを付けずに戻り値を返すことができます
これをnaked returnと呼ぶそうですnakedの意味が裸、ありのまま、露骨のような意味があるようなのですがnaked returnの意味はよくわかりません