関数攻略!Go言語のプログラムで定義方法を理解する

Go言語
この記事は約8分で読めます。
Go初学者
Go初学者

Go言語で関数の書き方知りたいけど、まずは基本を押さえたいな。

この記事ではGo言語の基本的な関数の書き方を理解できます!
  • パターン別でGo言語の関数の書き方を理解
    1. 引数なし・戻り値なしの場合
    2. 引数あり・戻り値なしの場合
    3. 引数あり・戻り値なしの場合
    4. 戻り値が複数の場合
    5. 引数あり・戻り値が複数ある場合
  • main関数の前に実行するinit関数について

Go言語の関数を自作する際の基本的な書き方をお伝えしていきます。

Go言語は静的型付け言語で「型」に厳しいプログラミング言語ですので、関数を書く時も型を意識しなければなりません。

今回はパターン別にお伝えしていきますので、ゆっくりと理解していきましょう。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語で関数を書く前に知っておくこと

Go言語で関数を書く際に知っておくことをコードで確認しておきましょう。

// 関数
package main

// 自作する関数はmain関数の外に書く
func 関数名(引数 型) 戻り値の型 {
    // 処理する内容を記述
}

func main() {
    // main関数内で実行
    関数名()
}

上記がGo言語の関数の基本です。

引数も返り値も型を指定する必要があります。

あと関数を実行するときはmain関数の中で実行しましょう。

【Go言語関数の基本】引数なし・戻り値なしのパターン

まずは引数なし・戻り値なしのパターンを見ていきましょう。

// 引数なし・戻り値なし
package main

import "fmt"

// 自作した関数
func NoArgNoValue() {
    fmt.Println("引数と戻り値がない関数です。")
}

func main() {
    // 関数を実行
    NoArgNoValue()
}
// 出力結果
$ go run main.go
引数と戻り値がない関数です。

引数と戻り値が無い場合は記述するものはありませんが、処理目的に合った関数名を付けましょう。

main関数内で実行された関数が処理され出力しています。

【Go言語関数の基本】引数あり・戻り値なしのパターン

引数あり・戻り値なしのパターンは足し算を行う関数を例にしてみます。

// 引数ありと戻り値無し
package main

import "fmt"

func add(x int, y int) {
    fmt.Println(x + y)
}

func main() {
    // 関数を実行
    add(10, 20)
}
// 出力結果
$ go run main.go
30

関数を実行する際に、 add(10, 20)引数x10引数y20 を与えていて、add関数で足し算した結果 30 を出力しています。

引数が複数で型が同じ場合は型をひとつに省略することができる

引数が複数あり型が一緒場合は、型をひとつだけ記述して省略することができます。

// 引数ありと戻り値無し
package main

import "fmt"

// 引数ありと戻り値無し関数
// func add(x int, y int) {
//     fmt.Println(x + y)
// }

// 引数の型を省略した場合
func add(x, y int) {  // 省略した場合
    fmt.Println(x + y)
}

func main() {
    // 関数を実行
    add(10, 20)
}

今回の例だと引数が2つなので省略した恩恵はありませんがコードは見やすくなります。

【Go言語関数の基本】引数あり・戻り値ありのパターン

引数あり・戻り値ありが一般的な関数定義です。

Go言語では戻り値にも型を指定するのがポイント

// 引数ありと戻り値ありの関数
package main

import "fmt"

// 戻り値にint型で型を指定
func plus(x, y int) int {
    return x + y   // returnでmain関数に値(x + y)を戻す
}

func main() {
    // 変数を宣言して関数を実行
    // 変数iにplus関数の戻り値が代入される(ココ大事)
    i := plus(1, 2)

    // 変数iを出力
    fmt.Println(i)
}
// 出力結果
$ go run main.go
3

【Go言語関数の基本】引数あり・戻り値が複数ある場合のパターン

引数を与えて計算結果を関数内で複数処理したい場合、もちろん戻り値も複数になります。

その場合のコードを確認してみましょう。

// 複数の戻り値がある場合
package main

import "fmt"

// 複数の戻り値がある場合
// 戻り値の型も2つ必要 ()で閉じる
func cal(x, y int) (int, int) {
    d := x / y
    r := x % y
    return d, r
}

func main() {
    // 変数を宣言して関数を実行
    div, rem := cal(10, 3)  // 戻り値が2つなので変数も2つ必要
    fmt.Printf("割り算の結果 %d\n", div)
    fmt.Printf("あまり %d\n", rem)
}
// 出力結果
$ go run main.go
割り算の結果 3
あまり 1

戻り値が複数の場合は型も複数必要 ()で閉じるのがポイント

戻り値の値を破棄したい場合

上記のコードで「あまり」の結果が必要でない場合は値を破棄することができます。

// 複数の戻り値がある場合
package main

import "fmt"

// 複数の戻り値がある場合
// 戻り値の型も2つ必要 ()で閉じる
func cal(x, y int) (int, int) {
    d := x / y
    r := x % y
    return d, r
}

func main() {
    // 戻り値が2つあり、片方の値は使用したくない場合
    // 変数の代わりに「_」を使用
    div, _ := cal(10, 3)
    fmt.Printf("割り算の結果 %d\n", div)
}
// 出力結果
// 「あまり」が表示されない
$ go run main.go
割り算の結果 3

使用したくない返り値の変数を宣言せずに _ で値を破棄

戻り値に型だけでなく変数宣言も一緒にする

戻り値に変数を宣言することができます。

戻り値に変数を宣言することで、関数を定義した1行目で関数での処理内容が把握しやすくなる利点があります。

package main

import "fmt"

// 戻り値に型だけでなく、変数も指定する場合
// (変数名 型)
func double(price int) (result int) {
    // 戻り値で変数宣言しているので代入する
    result = price * 2
    // 戻り値に変数を指定しているのでreturnだけで良い
    return
}

func main() {
    i2 := double(1000)
    fmt.Println(i2)
}
// 出力結果
$ go run main.go
2000  // 引数priceを2倍した値

【参考】init関数について

Go言語にはinit関数という特殊な関数があります。

通常であればmain関数から始まる処理を、init関数はmain関数より先に実行します。

用途ととしては、変数を確実に初期化した状態でmain関数を実行したい場合などです。

では、init関数がmain関数よりも先に実行されることをプログラムで確認しましょう。

// init関数
package main

import "fmt"

func init() {
    fmt.Println("init関数です!main関数より先に実行されます。")
}

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

func main() {
    i := plus(1, 2)
    fmt.Println(i)
}
// 出力結果
$ go run main.go 
init関数です!main関数より先に実行されます。
3
もりぴ
もりぴ

main関数の実行結果よりも先にinit関数が実行されていますね。

【まとめ】Go言語での関数の基本的な書き方

Go言語の関数は以下のコードが基本になります。

// 関数
package main

// 自作する関数はmain関数の外に書く
func 関数名(引数 型) (戻り値の変数名 戻り値の型) {
    // 処理する内容を記述
    return
}

func main() {
    // main関数内で実行
    変数名 := 関数名(引数)
}

この形をまずは理解しておきましょう。

各パターン別での注意するポイントは都度、確認しながらでも大丈夫です。

もりぴ
もりぴ

暗記するのではなくて、実際にコードを書いて理解していきましょう!

私自身、プログラミング学習を始めた時に関数を理解するまで苦労した経験があります。

理解できなくても焦らずに、自分でコードを改変しながらプログラムの出力結果と照らし合わせることで理解は深まっていきます。

諦めずに頑張りましょうね!

comment

タイトルとURLをコピーしました