C言語などコンパイル型言語の伝統に沿ってGoのプログラムはmain関数から始まるため、 変数宣言以外のコードは全て関数内に書く形になります。 文法的には素直ですが、特筆すべきは2006/01/02…という日付書式の設定方法ですね。 これは意外過ぎてびっくりしました。
/*============================*
* 複数行のコメントは
* このように
* 書けます。
*============================*/
// 1行コメントはこのように書けます。
package main
import (
"fmt"
"strings"
"strconv"
"regexp"
"time"
)
// Goのプログラムはmainパッケージのmain関数から開始する
func main(){
fmt.Println("Hello, World.")
fmt.Println("こんにちは。")
// 変数はvar、constで宣言するか、:=で宣言と同時に代入する方法がある
var1 := 42
var2 := 35
var3 := var1 + var2
var4 := var1 - var2
// C言語式のPrintfがある
fmt.Printf("結果は%dと%d\n", var3, var4)
// 注意:intからstringへの変換はstring関数ではできない。strconv.Itoaを使う。
// stringを使うとUnicodeで変換されてしまい変な文字になる
msg := "結果は" + strconv.Itoa(var3) + "と" + strconv.Itoa(var4)
fmt.Println(msg)
// C言語式の代入とインクリメント演算子もある
var2 += 18
var3--
var4++
fmt.Printf("%d %d %d\n", var2, var3, var4)
// 初期化時の値は 42 53 76 8
// 各要素は{}で囲む。JavaScriptやGroovyの[]とは違うので注意
arr1 := [...]int{var1, var2, var3, var4}
// ifやforの条件式を()で囲む必要はない
// 配列をrangeでループするときはインデックスと値の2変数が返る
// インデックス変数を使わないときは必ず _ と書く必要がある
for _,v := range arr1 {
if v >= 50 {
fmt.Printf("%dは50以上です。\n", v)
} else if v >= 40 && v < 50 {
fmt.Printf("%dは40以上50未満です。\n", v)
} else {
fmt.Printf("%dは50未満です。\n", v)
}
}
// Goにはdoubleという型はない。float32かfloat64
var var5 float32 = 1
// Goは配列長も文字列長もlenなので分かりやすい。Pythonと同じ
for i:=0; i<len(arr1); i++ {
var5 *= float32(arr1[i]) // 整数と小数の間でも型変換が必要
}
// 整形出力。カンマ区切りはできない?
fmt.Printf("計算結果:%-15.2f\n", var5)
str1 := "Hello,Power,Shell,World"
fmt.Printf("文字列の長さは%d\n", len(str1))
// 大文字に変換
fmt.Println(strings.ToUpper(str1))
// 配列の分割
arr2 := strings.Split(str1, ",")
// 配列を表示
fmt.Println(arr2)
re := regexp.MustCompile("^.[opqr]") // 2文字目がopqrのいずれか
for _,s := range arr2 {
if(re.MatchString(s)){
fmt.Println(s + "はマッチします。")
} else {
fmt.Println(s + "はマッチしません。")
}
}
// 現在時刻の取得
// 2番目の戻り値はerr(ここでは不使用)
loc,_ := time.LoadLocation("Asia/Tokyo")
d1 := time.Now().In(loc)
// 日付書式の指定方法が独特。2006,01,02…はこの数字を使う
dstr1 := d1.Format("2006/01/02 15:04:05")
// 指定した年月日の値を取得。マイクロ秒まで指定がある
d2 := time.Date(2020, 4, 26, 0, 0, 0, 0, loc)
dstr2 := d2.Format("2006/01/02")
// バッククォートで囲むとヒアドキュメント風になる
s := `現在時刻は%sです。
特定の日付とは…%sです。`
fmt.Printf(s, dstr1, dstr2)
}
// end.