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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎関数定義: 関数定義
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
181 行
111
</syntaxhighlight>
 
== ジェネリック関数 ==
2021年9月現在は、次期仕様に採用されることが内定している段階ですが、Goにはジェネリック関数があります。
 
;[https://go2goplay.golang.org/p/B584plPsjrG ジェネリック関数]:<syntaxhighlight lang="go" highlight="5-7,9,18,19"line>
package main
 
import "fmt"
 
type numeric interface {
type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
}
 
func sum[T numeric](s ...T) T {
var n T = 0
for _, v := range s {
n += v
}
return n
}
 
func main() {
fmt.Println(sum(1., 1.4142135623730951, 1.7320508075688772, 2., 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903, 3., 3.1622776601683795))
fmt.Println(sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
22.4682781862041
55
</syntaxhighlight>
: [[#可変長仮引数]]の例を、intだけでなく <code>type numeric interface</code>で定義した型の集合に拡張しました。
;[https://go2goplay.golang.org/p/QZ9NmeINNp- any を使った方法]:<syntaxhighlight lang="go" highlight="5,7,12-14"line>
package main
 
import "fmt"
 
func Print[T any](s ...T) {
for _, v := range s {
fmt.Println(v)
}
}
 
func main() {
Print(1., 1.4142135623730951, 1.7320508075688772)
Print(2, 3, 5)
Print([]byte("ABC")...)
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
1
1.4142135623730951
1.7320508075688772
2
3
5
65
66
67
</syntaxhighlight>
: 新しいキーワード any を使うと全称型に出来ますが、中で呼び出す関数や演算子が全称型を受け付ける必要があります。
: この例では、fmt.Println(v)が全称対応しているので any を使うことが出来ます。