変数の宣言と初期化(2)

先日、変数の宣言と初期化を一緒に行うには「var 変数 = 値」という書き方をする、てなことを書いた。
これ以外に、関数の中に限っては「変数 := 値」という書き方ができる。

package main

import "fmt"

func main() {
    name := "Andy"

    fmt.Println("Hello, " + name + "!")
}
^o^ > go run var4.go
Hello, Andy!

if文

if 文はいたって普通。else ifelsif でも elif でもなく else if

package main

import "fmt"

func isZero(n int) string {
    if n > 0 {
        return "More than zero."
    } else if n < 0 {
        return "Less than zero."
    } else {
        return "Just ZERO!"
    }
}

func main() {
    fmt.Println(isZero(3))
    fmt.Println(isZero(-1))
    fmt.Println(isZero(0))
}
^o^ > go run if.go
More than zero.
Less than zero.
Just ZERO!

関数

関数の定義には func キーワードを使う。

func 関数名(引数 型...) 返り値の型 {
    処理
}

引数、返り値とも型を後に書く。珍しいな。
値を返すには return を使う。
試してみよう。

package main

import "fmt"

func hello(name string) string {
    return "Hello, " + name + "!"
}

func main() {
    fmt.Println(hello("Andy"))
}
^o^ > go run func.go
Hello, Andy!

数値型

Go にはたくさんの数値型がある。

説明
int8 8bit整数
int16 16bit整数
int32 32bit整数
int64 64bit整数
int 32bitまたは64bit整数(処理系依存)
uint8 8bit符号なし整数
byte uint8の別名
uint16 16bit符号なし整数
uint32 32bit符号なし整数
uint64 64bit符号なし整数
uint 32bitまたは64bit符号なし整数(処理系依存)
float32 32bit単精度浮動小数点数
float64 64bit倍精度浮動小数点数
complex64 float32の実数部と虚数部をもつ複素数
complex126 float64の実数部と虚数部をもつ複素数

整数は通常10進数だけど、頭に 0 をつけると8進数、0x をつけると16進数と解釈される。

型が異なると計算できない。例えば同じ整数でも int と int64 の計算をしようとすると、次のようにエラーになる。

package main

import "fmt"

func main() {
    var a int
    var b int64

    a = 10
    b = 20

    fmt.Println(a + b)
}
^o^ > go run numbers.go
# command-line-arguments
.\numbers.go:12: invalid operation: a + b (mismatched types int and int64)

こういう場合は明示的に変換しなければならない。

package main

import "fmt"

func main() {
    var a int
    var b int64

    a = 10
    b = 20

    fmt.Println(int64(a) + b)
}
^o^ > go run numbers2.go
30

変数の宣言と初期化

変数を使うには宣言をする必要がある。変数の宣言は var 変数名 型 という形で行う。

var a int

宣言と同時に初期化もできる。この場合には型を省略できる。

var a = 10

初期化しないとゼロ値に初期化される。ゼロ値とは、数値型では 0、文字列型では空文字列、bool型では false のこと。

package main

import "fmt"

func main() {
    var a int
    var b string
    var c bool

    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
^o^ > go run var3.go
0

false

コマンドライン引数

コマンドライン引数は C のように main 関数の引数で受け取るのではなく、os パッケージの os.Args 関数を使う。

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println(os.Args)
}
^o^ > go build args.go

^o^ > args foo  bar baz
[args foo bar baz]

os.Args の返り値は文字列の配列。最初の要素は実行ファイル名、これは C と同じだな。

import

使用するライブラリ(パッケージ)の読み込みは import 文で行う。

import "fmt"

読み込むパッケージが複数の場合、import 文を並べて書いてもいいけど、下のようにカッコで囲んで一つにしてもいい。

import (
    "fmt"
    "os"
)

こっちのほうが、読みやすいな。

文字コード

Go のソースコードは UTF-8 で書くと決まっている。UTF-8 で書いてあれば、日本語も問題なく使える。たとえ Windows でも。

package main

import "fmt"

func main() {
    fmt.Println("こんにちは!")
}
^o^ > go run hello_ja_utf8.go
こんにちは!

UTF-8 以外の文字コード、例えば Shift JIS で書くと次のようにエラーになる。

^o^ > go run hello_ja_sjis.go
# command-line-arguments
.\hello_ja_sjis.go:6: invalid UTF-8 encoding

Hello, world!

気が付けば今月も20日を過ぎている。まずいな。
まあ、いい。日にちが開いてしまってけど、ちょっとずつ Go をやっていこう。

今日は定番の Hello, world プログラムを作った。

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

Go のプログラムはパッケージから構成される。package 文で宣言する。ここでは main という名前でパッケージを作っている。
Go のプログラムは main パッケージの main 関数がエントリポイントになる。だからプログラムのパッケージ名は main で、main という名前の関数がなければいけない。
関数の定義は func 関数名 で行う。上の例では main 関数だけがある。
import 文は、ライブラリの読み込み。ライブラリ(パッケージ)名をクォートでくくって指定する。ここでは出力のために fmt パッケージを読み込んでいる。
そして、fmt.Println 関数が標準出力への出力。引数の文字列に改行をつけて出力する。

じゃあ、実行してみよう。

^o^ > go run hello.go
Hello, world!

今日はここまで。

Go言語のインストール

気が付けば夏休みも最終日だ。このままでは今月ブログの更新なしになってしまうところだ。
大したネタもないので、Go 言語のインストールのことでも書いておこう。ダウンロードはここから。

 cf. https://golang.org/dl/

Windows 用には msi インストーラがあるので、それをダウンロードして実行するだけ。すごく簡単。