"Fossies" - the Fresh Open Source Software Archive

Member "go/test/typeparam/mdempsky/13.go" (26 Apr 2023, 1414 Bytes) of package /linux/misc/go1.20.4.src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Go source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 // run
    2 
    3 // Copyright 2021 The Go Authors. All rights reserved.
    4 // Use of this source code is governed by a BSD-style
    5 // license that can be found in the LICENSE file.
    6 
    7 package main
    8 
    9 // Interface which will be used as a regular interface type and as a type bound.
   10 type Mer interface{
   11     M()
   12 }
   13 
   14 // Interface that is a superset of Mer.
   15 type Mer2 interface {
   16     M()
   17     String() string
   18 }
   19 
   20 func F[T Mer](t T) {
   21     T.M(t)
   22     t.M()
   23 }
   24 
   25 type MyMer int
   26 
   27 func (MyMer) M() {}
   28 func (MyMer) String() string {
   29     return "aa"
   30 }
   31 
   32 // Parameterized interface
   33 type Abs[T any] interface {
   34     Abs() T
   35 }
   36 
   37 func G[T Abs[U], U any](t T) {
   38     T.Abs(t)
   39     t.Abs()
   40 }
   41 
   42 type MyInt int
   43 func (m MyInt) Abs() MyInt {
   44     if m < 0 {
   45         return -m
   46     }
   47     return m
   48 }
   49 
   50 type Abs2 interface {
   51     Abs() MyInt
   52 }
   53 
   54 
   55 func main() {
   56     mm := MyMer(3)
   57     ms := struct{ Mer }{Mer: mm }
   58 
   59     // Testing F with an interface type arg: Mer and Mer2
   60     F[Mer](mm)
   61     F[Mer2](mm)
   62     F[struct{ Mer }](ms)
   63     F[*struct{ Mer }](&ms)
   64 
   65     ms2 := struct { MyMer }{MyMer: mm}
   66     ms3 := struct { *MyMer }{MyMer: &mm}
   67 
   68     // Testing F with a concrete type arg
   69     F[MyMer](mm)
   70     F[*MyMer](&mm)
   71     F[struct{ MyMer }](ms2)
   72     F[struct{ *MyMer }](ms3)
   73     F[*struct{ MyMer }](&ms2)
   74     F[*struct{ *MyMer }](&ms3)
   75 
   76     // Testing G with a concrete type args
   77     mi := MyInt(-3)
   78     G[MyInt,MyInt](mi)
   79 
   80     // Interface Abs[MyInt] holding an mi.
   81     intMi := Abs[MyInt](mi)
   82     // First type arg here is Abs[MyInt], an interface type.
   83     G[Abs[MyInt],MyInt](intMi)
   84 }