0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(プログラミング)入門メモ②

Last updated at Posted at 2025-01-03

関数

関数とはひとまとまりの処理に名前を付けて、何度も呼び出せるようにしたもの。
func 関数名(){処理の中身}で定義できる。関数を呼び出すときは関数名()で呼び出すことができる。
引数を使用する場合は、関数名のあとの()に引数の名前と引数のデータ型を入れる。
※引数とは、関数を呼び出す際に関数に渡す値のこと。
add関数を定義してみると

func add(int x, int y){
    fmt.Println(x + y)
}
func main() {
    add(10,20)
}
//x + yの合計が出力されるadd関数を定義し、main関数の中でadd関数を呼び出している。ここでは引数がxは10,yは20なので30が出力される。

返り値を返す関数の定義

返り値とは、関数が返す値のこと。引数の()のあとに返りのデータ型を指定し、returnで値を呼び出し元に返す。

func add(int x, int y) int {
    return x + y
}
func main () {
    r := add(10,20) //返り値を変数rに代入している
    fmt.Println(r)   
}
//30が出力される

返り値に名前を付けたいときは引数の()のあとに(返り値名 返り値のデータ型)という形で定義する。以下は返り値にint型のresultという名前を付けたcul関数

func cal(price, item int)(result int){
    result = price*item
    return result  //resultを省略することも可能
}
func main () {
    r := cal(100,2)
    fmt.Println(r)
}
//200が出力される

関数リテラル

関数は変数に入れることもできる。以下のコードでは、main関数内で関数を定義して変数fに代入している。変数に代入した関数は変数名()で呼び出すことができる。

func main () {
    f := func(x int){
        fmt.Println("innner func", x)
    }
    f(1)
}
//inner func 1 と出力される

funcのあとに関数名を入れるのが一般的だが上記は名前がない。このような関数を関数リテラル、という(ほかの言語ではラムダ式や無名関数という)
また、関数リテラルは変数に代入せずにそのまま実行することもできる。このとき、関数の範囲を表す{}のあとに()を入れて(引数がある場合は引数も入れる)実行させることができる

func main () {
    func(x int){
        fmt.Println("innner func", x)
    }(1)
}
//inner func 1 と出力される

クロージャーについて

関数リテラルは、同じ関数の中で宣言された変数にアクセスすることができる。この仕組みをクロージャーという。
以下のコードは、main関数内で変数xを宣言し、そこにincrementに代入した関数がアクセスしている。

func main () {
    x := 0
    increment := func () int {
        x++
        return x
    }
    fmt.Println(increment())
    fmt.Println(increment())
    fmt.Println(increment())
}
//
1
2
3
と出力される

関数を返り値にする

返り値で関数を返す関数も定義することができる。returnで関数リテラルを返り値として、呼び出しもとに渡すことができる。以下のコードは、returnの後ろにあるfunc() intを返している。
main関数では、incrementGenerator()を変数counterに代入している。counter()で代入した関数を呼び出している。

func incrementGenerator() func() int {
    x := 0
    return func() int {
        x++
        return x
    }    
}

func main () {
    counter := incrementGenerator()
    fmt.Println(counter())
    fmt.Println(counter())
    fmt.Println(counter())
}
//
1
2
3
と出力される

学習に使用した教材

・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?