1// Copyright 2021 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// Package generics contains the new syntax supporting generic programming in 6// Go. 7package generics 8 9// Variables with an instantiated type should be shown. 10var X Type[int] 11 12// Parameterized types should be shown. 13type Type[P any] struct { 14 Field P 15} 16 17// Constructors for parameterized types should be shown. 18func Constructor[lowerCase any]() Type[lowerCase] { 19 return Type[lowerCase]{} 20} 21 22// MethodA uses a different name for its receiver type parameter. 23func (t Type[A]) MethodA(p A) {} 24 25// MethodB has a blank receiver type parameter. 26func (t Type[_]) MethodB() {} 27 28// MethodC has a lower-case receiver type parameter. 29func (t Type[c]) MethodC() {} 30 31// Constraint is a constraint interface with two type parameters. 32type Constraint[P, Q interface{ string | ~int | Type[int] }] interface { 33 ~int | ~byte | Type[string] 34 M() P 35} 36 37// int16 shadows the predeclared type int16. 38type int16 int 39 40// NewEmbeddings demonstrates how we filter the new embedded elements. 41type NewEmbeddings interface { 42 string // should not be filtered 43 int16 44 struct{ f int } 45 ~struct{ f int } 46 *struct{ f int } 47 struct{ f int } | ~struct{ f int } 48} 49 50// Func has an instantiated constraint. 51func Func[T Constraint[string, Type[int]]]() {} 52 53// AnotherFunc has an implicit constraint interface. 54// 55// Neither type parameters nor regular parameters should be filtered. 56func AnotherFunc[T ~struct{ f int }](_ struct{ f int }) {} 57 58// AFuncType demonstrates filtering of parameters and type parameters. Here we 59// don't filter type parameters (to be consistent with function declarations), 60// but DO filter the RHS. 61type AFuncType[T ~struct{ f int }] func(_ struct{ f int }) 62 63// See issue #49477: type parameters should not be interpreted as named types 64// for the purpose of determining whether a function is a factory function. 65 66// Slice is not a factory function. 67func Slice[T any]() []T { 68 return nil 69} 70 71// Single is not a factory function. 72func Single[T any]() *T { 73 return nil 74} 75