「Go/関数」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
M {{Nav}}
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
1 行
{{Nav}}
== 関数 ==
=== ユーザ定義関数定義 ===
;書式関数定義:<syntaxhighlight lang="go">
==== 基本 ====
func 関数名([仮引数名 仮引数型{, 仮引数名 仮引数型}]) [戻値の型{, 戻値の型}] {
Goのユーザ定義関数は、
その関数の/* 処理内容 */
 
[return 戻{, 戻値}]
;書式:<syntaxhighlight lang="go">
func 定義したい関数の名称(引数の名称 引数の型) {
その関数の処理内容
return 戻り値
}
</syntaxhighlight>
です。
 
;[https://paiza.io/projects/55F0TajRrjOx7rEwOQ3W1g?language=go コード例]:<syntaxhighlight lang="go">
package main
 
19 ⟶ 16行目:
 
func sch() {
fmt.Println("いま外出先schにいる")
}
 
func main() {
fmt.Println("いまmainにいる")
sch()
}
</syntaxhighlight>
 
;実行結果:<syntaxhighlight lang=text>
いまmainにいる
いま外出先schにいる
</syntaxhighlight>
 
==== ローカル変数 ====
関数の仮引数、関数の中が終了するま宣言された変数、構造構文の最初の項で宣言された変数はロがスコカル変数です。
関数の中で宣言された変数は、関数が終了するまでがスコープのローカル変数です。
if文、switch文、switch文、for文などの構造構文の第一項が簡単な宣言であった場合、そこで宣言された変数のスコープは構造構文が終わるまでです。
 
;[https://paiza.io/projects/XMxkCDHp2z1NZHoQf6EVuQ?language=go コード例]:<syntaxhighlight lang="go">
42 ⟶ 40行目:
 
var a = "ABC"
 
func function1() {
a := 0
fmt.Println("a@function1 = " , a)
}
 
func function2() {
fmt.Println("a@function2 = " , a)
}
 
func main() {
a := 1
fmt.Println("a =", a)
function1()
function2()
fmt.Println("a' = ", a)
sum := 0
for i := 0; i <= 10; i++ {
sum += i
}
fmt.Println("sum =", sum)
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
a = 1
a@function1 = 0
a@function2 = ABC
a' = 1
sum = 55
</syntaxhighlight>
: main と function1 では、グローバル変数 a は同名のローカル変数 a にシャドーイングされます。
: function2 では、(シャドーイングされないので)グローバル変数 a が表示されています。
 
== 可変長仮引数 ==
Goの関数では可変長仮引数がサポ-トされています。
 
;[https://paiza.io/projects/Uth1bYAZKeOdZm0wV_CiNg?language=go コード例]:<syntaxhighlight lang="go" highlight="5,14,15"line>
package main
 
import "fmt"
 
func sum(s ...int) int {
n := 0
for _, v := range s {
n += v
}
return n
}
 
func main() {
fmt.Println(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
v := []int{1, 2, 4, 8, 16, 32, 64, 128, 256}
fmt.Println(sum(v...))
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
55
511
</syntaxhighlight>