// Copyright 2020 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. // This file contains basic generic code snippets. package p // type parameter lists type B[P any] struct{} type _[P interface{}] struct{} type _[P B] struct{} type _[P B[P]] struct{} type _[A, B, C any] struct{} type _[A, B, C B] struct{} type _[A, B, C B[A, B, C]] struct{} type _[A1, A2 B1, A3 B2, A4, A5, A6 B3] struct{} type _[A interface{}] struct{} type _[A, B interface{ m() }] struct{} type _[A, B, C any] struct{} // in functions func _[P any]() func _[P interface{}]() func _[P B]() func _[P B[P]]() // in methods func (T) _[P any]() func (T) _[P interface{}]() func (T) _[P B]() func (T) _[P B[P]]() // type instantiations type _ T[int] // in expressions var _ = T[int]{} // in embedded types type _ struct{ T[int] } // interfaces type _ interface{ m() ~int } type _ interface{ ~int | ~float | ~string ~complex128 underlying(underlying underlying) underlying } type _ interface{ T T[int] } // tricky cases func _(T[P], T[P1, P2]) func _(a [N]T) type _ struct{ T[P] T[P1, P2] f [N] } type _ interface{ m() // generic methods - disabled for now // m[] /* ERROR empty type parameter list */ () // m[ /* ERROR cannot have type parameters */ P any](P) // instantiated types // T[] /* ERROR empty type argument list */ T[P] T[P1, P2] }