// 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 generics contains the new syntax supporting generic programming in // Go. package generics // Variables with an instantiated type should be shown. var X Type[int] // Parameterized types should be shown. type Type[P any] struct { Field P } // Constructors for parameterized types should be shown. func Constructor[lowerCase any]() Type[lowerCase] { return Type[lowerCase]{} } // MethodA uses a different name for its receiver type parameter. func (t Type[A]) MethodA(p A) {} // MethodB has a blank receiver type parameter. func (t Type[_]) MethodB() {} // MethodC has a lower-case receiver type parameter. func (t Type[c]) MethodC() {} // Constraint is a constraint interface with two type parameters. type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { ~int | ~byte | Type[string] M() P } // int16 shadows the predeclared type int16. type int16 int // NewEmbeddings demonstrates how we filter the new embedded elements. type NewEmbeddings interface { string // should not be filtered int16 struct{ f int } ~struct{ f int } *struct{ f int } struct{ f int } | ~struct{ f int } } // Func has an instantiated constraint. func Func[T Constraint[string, Type[int]]]() {} // AnotherFunc has an implicit constraint interface. // // Neither type parameters nor regular parameters should be filtered. func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) {} // AFuncType demonstrates filtering of parameters and type parameters. Here we // don't filter type parameters (to be consistent with function declarations), // but DO filter the RHS. type AFuncType[T ~struct{ f int }] func(_ struct{ f int }) // See issue #49477: type parameters should not be interpreted as named types // for the purpose of determining whether a function is a factory function. // Slice is not a factory function. func Slice[T any]() []T { return nil } // Single is not a factory function. func Single[T any]() *T { return nil }