Goの場合

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.