「Go/関数」の版間の差分
削除された内容 追加された内容
タグ: 2017年版ソースエディター |
タグ: 2017年版ソースエディター |
||
183 行
== ジェネリック関数 ==
| 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 に合致するので、異種スタックを実現できます。
|