Go言語基本文法(1) ~関数、変数、型、定数~

標準出力

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    fmt.Println("Hello, World")
    // Hello, World

    fmt.Println("My favorite number is", rand.Intn(100))
    // My favorite number is 81

    fmt.Println("The time is", time.Now())
    // The time is 2020-03-05 11:02:08.950132 +0900 JST m=+0.000170890
}
package main

import (
    "fmt"
    "math/cmplx"
)

var (
    ToBe   bool       = false
    MaxInt uint64     = 1<<64 - 1
    z      complex128 = cmplx.Sqrt(-5 + 12i)
)

func main() {
    fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
    // Type: bool Value: false
    fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
    // Type: uint64 Value: 18446744073709551615
    fmt.Printf("Type: %T Value: %v\n", z, z)
    // Type: complex128 Value: (2+3i)
}

関数の定義

package main

import "fmt"

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

// 次のように書いてもよい
// func add(x, y int) int {
//     return x + y
// }

func main() {
    fmt.Println(add(42, 13))
    // 55
}

複数の戻り値も返せる

package main

import "fmt"

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

func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
    // world hello
}
package main

import "fmt"

func split(sum int) (x, y int) {
    x = sum * 2 / 5
    y = sum - x
    return
}

func main() {
    fmt.Println(split(10))
    // 4 6
}

変数の宣言

package main

import "fmt"

var c, python, java bool

func main() {
    var i int
    fmt.Println(i, c, python, java)
    // 0 false false false
}
package main

import "fmt"

var i, j int = 1, 2

func main() {
    var c, python, java = true, false, "no!"
    fmt.Println(i, j, c, python, java)
    // 1 2 true false no!
}

変数宣言と初期化を関数の内部で行う場合は,varと型宣言を省略し,:=という記号を用いることができる。

package main

import "fmt"

func main() {
    k := 3
    c, python, java := true, false, "no!"

    fmt.Println(k, c, python, java)
    // 3 true false no!
}

型変換

package main

import (
    "fmt"
    "math"
)

func main() {
    var x, y int = 3, 4
    var f float64 = math.Sqrt(float64(x*x + y*y))
    var z uint = uint(f)
    fmt.Println(x, y, z)
    // 3 4 5
}

型推論

package main

import "fmt"

func main() {
    v := "aaa"
    x := 10
    y := 5.5
    z := 0.3 + 2i
 
    fmt.Printf("%T\n", v)
    // string
    fmt.Printf("%T\n", x)
    // int
    fmt.Printf("%T\n", y)
    // float64
    fmt.Printf("%T\n", z)
    // complex128
}

定数

package main

import "fmt"

const Pi = 3.14

func main() {
    const g = 9.8
 
    fmt.Println(Pi)
    // 3.14
 
    fmt.Println(g)
    // 9.8
}

可変長引数

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
}

参考

A Tour of Go