PHPerが始めるgo言語入門 〜言語仕様〜
続いてgo言語の言語仕様を確認していきます。
五月雨でアレですが。
コメントアウト
1行 // 複数行 /* */
インポート
import (
"fmt"
"strings"
)
import (
f "fmt" //fという別名を使う
_ "os" // _は対象パッケージを使わないことをコンパイラに明示する。使っていないパッケージがあるとコンパイルエラーになる
. "strings" // .でパッケージ名を省略できる
)
変数の宣言
var 変数名 型 = 値 var message string = "hellow world"
複数同時に宣言
var hoge, foo, bar string = "hoge", "foo", "bar" var ( a string = "a" b = "b" c = "c" ) 同じ型なら2つ目以降は省力可能
関数内部での変数宣言
:=で型推論で宣言できる
func main() {
// 同じ意味
// var message string = "hello world"
message := "hello world"
fmt.Println(message)
}
定数
constで定数に const Message string = "hello world"
初期値なしで宣言
var i int // i = 0 int => 0 float => 0.0 bool => false string => "" 配列 => 要素0の配列 構造体 => プロパティが0の構造体 その他 nil
if文
if hoge > foo {
} else if hoge < foo {
} else {
}
3項演算子はなし
if1行だけもなし
ループ
ループはforだけ
for i := 0; i < 10; i++ {
}
いわゆるwhile的なfor
i := 0
for i < 10 {
fmt.Printf("i = %d\n", i)
i++
}
break,continue
i := 0
for {
i++
if i > 10 {
break //ループ抜ける
}
if i % 2 == 0 {
continue //偶数なら次のループへ
}
fmt.Println(n)
}
switch文
switch i {
case 1:
fmt.Println("1")
case 2, 4:
fmt.Println("2 or 4")
case 5 < i:
fmt.Println("greater 5")
default
fmt.Println("default")
}
switchで比較もオッケー
phpだとcaseに入ってもbreakを書かないと次のcaseへ進むが、golangは1つcaseが実行されたら、switchを抜ける
逆に1つcaseを実行されても次のcaseに行きたい時は[fallthrough]と書く
switch i {
case 1:
fmt.Println("1")
fallthrough
case 2, 4:
fmt.Println("2 or 4")
fallthrough
default
fmt.Println("default")
}
関数
func 関数名(引数 型) 戻り値の型 {
}
func sum(i, j int) { //sum(i int, j int)
fmt.Println(i + j)
}
func sum(i, j int) int { //sum(i int, j int)
return i + j
}
func main() {
n := sum(1, 2)
fmt.Println(n) //3
}
func change(i, j int) (int, int) {
return j, i
}
func main() {
x, y := 3, 4
x, y = change(x, y)
fmt.Println(x, y) //4 3
}
名前付きの戻り値
func div(i, j int) (result int, err error) {
if j == 0 {
err = errors.New("divied by zero")
return // return 0, errと同じ
}
result = i / j
return // return result, nilと同じ
}
無名関数
func main() {
func(i, j int) {
fmt.Println(i + j)
}(2, 4)
}
配列
goの配列は固定長
var arr1 [4]string //4つの要素がある配列
arr[0] = "a"
arr[1] = "b"
arr[2] = "c"
arr[3] = "d"
fmt.Println(arr[0]) // a
// 宣言と同時に初期化
// どちらも同じ
arr := [4]string{"a", "b", "c", "d"}
arr := [...]string{"a", "b", "c", "d"}
関数に配列渡す時は値渡し
スライス
可変長の配列
var s []string
s := []string{"a", "b", "c", "d"}
fmt.Println(s[0]) // "a"
値追加
var s []string
s = append(s, "a") // 追加した結果を返す
s = append(s, "b")
s = append(s, "c", "d")
fmt.Println(s) // [a b c d]
s1 := []string{"a", "b"}
s2 := []string{"c", "d"}
s1 = append(s1, s2...) // s1にs2を追加
fmt.Println(s1) // [a b c d]
range
先頭から順番に処理
いわゆるforeach的な感じ
arr := [...]string{"a", "b", "c", "d"}
for i, s := range arr {
// i = 添字, s = 値
fmt.Println(i, s)
}
値の切り出し
s := []int{0, 1, 2, 3, 4, 5}
fmt.Println(s[2:4]) // [2 3]
fmt.Println(s[0:len(s)]) // [0 1 2 3 4 5]
fmt.Println(s[:3]) // [0 1 2 3]
fmt.Println(s[3:]) // [3 4 5]
fmt.Println(s[:]) // [0 1 2 3 4 5]
可変長引数
phpでもこういうのできるようになりますね
可変長で引数を取ることができる
func sum(nums ...int) (result int) {
// numsは[]int型
for _, n := range nums { //添字は捨てる
result += n
}
return
}
func main() {
fmt.Println(sum(1, 2, 3, 4)) // 10
}
マップ
ハッシュ的なやつです
キーと値で、格納
var month map[int]string = map[int]string{}
month[1] = "January"
month[2] = "February"
fmt.Println(month) // map[1:January 2:February]
month := map[int]string{
1: "January",
2: "February",
}
fmt.Println(month) // map[1:January 2:February]
値の取得
jan := month[1]
fmt.Println(jan) // January
2つ目の戻り値に値があるかboolで返してくれる
_, ok := month[1]
if ok {
// データがあった場合
}
マップから情報を消すのはdelete
delete(month, 1)
fmt.Println(month) // map[2:February]かなり雑でアレですが。。。
感謝致します。
