Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@R_R

Go 言語仕様2(関数)

概要

複数の言語を扱っていると仕様が混ざるので、まとめておく。

前回:
Go 言語仕様1(変数、型)

内容

  • 関数

関数

  • 基本的なところ
package main

import "fmt"

// NoReturn return値なし
func NoReturn(s string) {
    fmt.Println(s)
}

// Return return値あり
func Return(x int, y int) int {
    return x + y
}

// ReturnSome return値複数あり
func ReturnSome(x int, y int) (int, int) {
    plus := x + y
    minus := x - y

    return plus, minus
}

// Default returnの変数をデフォルトで宣言しておく
func Default(ss string) (result string) {
    // 関数内で宣言の必要なし
    result = "Hello, " + ss
    // return値も省略可
    return
}

func main() {
    NoReturn("Golang") // Golang

    sum := Return(10, 20)
    fmt.Println(sum) // 30

    p, m := ReturnSome(1000, 200)
    fmt.Println(p, m) // 1200 800

    fmt.Println(Default("Golang")) // Hello, Golang
}

  

  • 無名関数
package main

import "fmt"

func main() {
    // 関数名は付けない。関数を変数に格納するイメージ。
    f := func(x int, y int) int {
        return x + y
    }

    fmt.Println(f(20, 10)) // 30

    // 直接実行することもできる
    ff := func(x int, y int) int {
        return x + y
    }(20, 10)

    fmt.Println(ff) // 30
}

  

  • 引数、戻り値に関数を指定する
package main

import "fmt"

// Return 関数をreturnする
func Return() func() {
    return func() {
        fmt.Println("Golang")
    }
}

// Execute 引数で渡ってきた関数を実行する
func Execute(f func()) {
    f()
}

func main() {
    f := Return()
    f()

    Execute(f)
}

  

  • クロージャー
package main

import "fmt"

// LaterFunc クロージャー
func LaterFunc() func(int) int {
    var sum int
    // LaterFunc内で定義された無名関数は、LaterFunc内のローカル変数sumにアクセスできる
    return func(i int) int {
        result := sum
        sum = sum + i
        return result
    }
}

func main() {
    // 戻り値の無名関数も、LaterFunc内のローカル変数sumにアクセスできる
    f := LaterFunc()
    // さらに、ローカル変数sumの値は保持される
    fmt.Println(f(10)) // 0
    fmt.Println(f(10)) // 10
    fmt.Println(f(10)) // 20
    fmt.Println(f(10)) // 30
    fmt.Println(f(10)) // 40
}

次回

Go 言語仕様3(エラーハンドリング、for文、型アサーション、switch文、型スイッチ)

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
R_R

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?