// run // Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main type I interface { foo() int } // There should be one instantiation of f for both squarer and doubler. // Similarly, there should be one instantiation of f for both *incrementer and *decrementer. func f[T I](x T) int { return x.foo() } type squarer int func (x squarer) foo() int { return int(x*x) } type doubler int func (x doubler) foo() int { return int(2*x) } type incrementer int16 func (x *incrementer) foo() int { return int(*x+1) } type decrementer int32 func (x *decrementer) foo() int{ return int(*x-1) } func main() { println(f(squarer(5))) println(f(doubler(5))) var i incrementer = 5 println(f(&i)) var d decrementer = 5 println(f(&d)) }