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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
183 行
 
== ジェネリック関数 ==
2021Go 1.18 (20229月現在は、次期仕様に採用されることが内リリース予している段階すがGoにはジェネリック関数があり追加されることが決まっています<ref>{{cite book
| url=https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
| title=Type Parameters Proposal
| accessdate=2021-09-30
}}</ref>。
 
=== 数値型に限定したジェネリック関数 ===
;[https://go2goplay.golang.org/p/B584plPsjrG 数値型に限定したジェネリック関数]:<syntaxhighlight lang="go" highlight="5-7,9,18,19"line>
package main
 
212 ⟶ 217行目:
</syntaxhighlight>
: [[#可変長仮引数]]の例を、intだけでなく <code>type numeric interface</code>で定義した型の集合に拡張しました。
 
=== any を使った方法 ===
;[https://go2goplay.golang.org/p/QZ9NmeINNp- any を使った方法]:<syntaxhighlight lang="go" highlight="5,7,12-14"line>
package main
242 ⟶ 249行目:
: 新しいキーワード any を使うと全称型に出来ますが、中で呼び出す関数や演算子が全称型を受け付ける必要があります。
: この例では、fmt.Println(v)が全称対応しているので any を使うことが出来ます。
 
=== interface{}も any に合致する ===
;[https://go2goplay.golang.org/p/XL217FrW9kM interface{}も any に合致する]:<syntaxhighlight lang="go" highlight="23"line>
package main
 
import "fmt"
 
type Stack[T any] []T
 
func (s *Stack[T]) Push(v T) {
*s = append(*s, v)
}
 
func (s *Stack[T]) Pop() (value T, err bool) {
if len(*s) == 0 {
var zero T
return zero, false
}
r := (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
// fmt.Println(r, *s)
return r, true
}
 
func main() {
s := Stack[interface{}]{}
s.Push("abc")
s.Push(123)
s.Push(struct {
s string
i int
}{s: "a", i: 1})
fmt.Println(s)
for v, ok := s.Pop(); ok; v, ok = s.Pop() {
fmt.Println(v)
}
}
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
[abc 123 {a 1}]
{a 1}
123
abc
</syntaxhighlight>
; 解説 :<syntaxhighlight lang="go" start="23"line>
s := Stack[interface{}]{}
</syntaxhighlight>
: interface{} も any に合致するので、異種スタックを実現できます。