Go言語マスター 〜関数や変数の基本〜

公開日:2022-08-21
go

https://youtu.be/a9bQQDX1Ssk

はじめに

Goの関数や変数について解説します。

imports

前回の解説で使用したimportではimportを複数行書きました。

import "fmt"
import "math"

これは次のように複数をまとめてimportできます。

import (
    "fmt"
    "math"
)

Exported names

全体のソースコードは次の様で実際に実行してみましょう。

package main

import (
  "fmt"
  "math"
)

func main() {
  fmt.Println(math.pi)
}

実際に実行してみるとエラーになります。「undefined: math.pi」と表示されます。
Goでは外部に公開したい関数や変数の名前は大文字から始めることで、他のパッケージから呼び出すことができるようになっています。
今回は、piが大文字でないためエラー発生しました。次のように修正すると実行できます。

package main

import (
  "fmt"
  "math"
)

func main() {
  fmt.Println(math.Pi)
}

ちなみに同じパッケージ上であれば小文字から始まる関数や変数にもアクセスできます。実際にコードを書いて確認してみます。

hoge.goというファイルを作成します。hoge.goファイル内に次のように記述します。

package main

const hoge = "hogehoge"

main.goファイル内に次の様に記述します。

package main

import  "fmt"

func main() {
  fmt.Println(hoge)
}

main.goファイルを実行してみます。実行をすると「hogehoge」と表示されます。

Functions

関数の記述方法についてです。

package main

import "fmt"

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

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

このadd関数はint型の2つの引数を取ります。また関数名の後に戻り値の型を記述します。

Muliple results

関数で2つ以上の戻り値を返す方法です。

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)
}

関数名の後ろに戻り値の数と同じ数の型を記述することで、複数の戻り値を返すことができます。

Named return values

戻り値の変数に名前をつける方法についてです。

package main

import "fmt"

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

func main() {
  fmt.Println(split(17))
}

split関数のように関数名の後に変数を書き込むことによって、関数内で宣言することなく変数を記述できます。
返り値の変数と型が最初に指定されているため、returnのみで終了できます。

ただし記述方法は長い関数の中で使用してしまうとコードの可読性が損なわれるため、短い関数の中でのみ使用すると良いでしょう。

Variables

変数についてです。

package main

import "fmt"

var c, python, java bool

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

変数はvar 変数名変数名、型のように記述します。

Variables with initializers

変数の初期化方法についてです。

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)
}

変数の初期化はvar 変数名, 変数名 型 = 値, 値のように記述します。

Short variable declarations

変数の暗黙的宣言の方法についてです。

package main

import "fmt"

func main() {
  var i, j int = 1, 2
  k := 3
  c, python, java := true, false, "no!"

  fmt.Println(i, j, k, c, python, java)
}

関数の中では、varの代わりに:=を使用できます。k := 3をvarで書き換えるとvar k int = 3となります。

varと比べると記述量が少なくなるため、こちらの方がよく使われます。

Basic types

Go言語の変数の型は次の様なものがあります。

  • bool
  • string
  • int int8 int16 int32 int64 int数値はbit数値を示しています。
  • uint uint8 uint16 uint32 uint64 uintptr // uint数値はbit数値を示しています。
  • byte // uint8の別名
  • rune // int32の別名
  • float32 float64
  • complex64 complex128

Type conversions

変数の型を変換する方法についてです。

package main

import (
  "fmt"
)

func main() {
  var x float64 = 3.1
  fmt.Println(int(x))
}

float64型をint型に変換するにはint(変数)とできます。他の型も同様に変更できます。

Constants

定数に扱いについてです。

package main

import "fmt"

const Pi = 3.14

func main() {
  const World = "世界"
  fmt.Println("Hello", World)
  fmt.Println("Happy", Pi, "Day")

  const Truth = true
  fmt.Println("Go rules?", Truth)
}

const 変数名 = 値とすることで定数は宣言できます。定数は、文字、文字列、boolean、数値で使えます。

Numeric Constants

数値の定数についてです。

package main

import "fmt"

const (
  // Create a huge number by shifting a 1 bit left 100 places.
  // In other words, the binary number that is 1 followed by 100 zeroes.
  Big = 1 << 100
  // Shift it right again 99 places, so we end up with 1<<1, or 2.
  Small = Big >> 99
)

func needInt(x int) int { return x * 10 + 1 }
func needFloat(x float64) float64 {
  return x * 0.1
}

func main() {
  fmt.Println(needInt(Small))
  fmt.Println(needFloat(Small))
  fmt.Println(needFloat(Big))
}

needIntは引数をint、needFloatは引数をfloatとしています。実行時に定数がint型やfloat型へ変換されています。

まとめ

今回は、変数と関数の基礎文法などを学習しました。次回は、for文について説明をします。