github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/interface/struct.go (about)

     1  // run
     2  
     3  // Copyright 2009 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  // Test interface values containing structures.
     8  
     9  package main
    10  
    11  import "os"
    12  
    13  var fail int
    14  
    15  func check(b bool, msg string) {
    16  	if (!b) {
    17  		println("failure in", msg)
    18  		fail++
    19  	}
    20  }
    21  
    22  type I1 interface { Get() int; Put(int) }
    23  
    24  type S1 struct { i int }
    25  func (p S1) Get() int { return p.i }
    26  func (p S1) Put(i int) { p.i = i }
    27  
    28  func f1() {
    29  	s := S1{1}
    30  	var i I1 = s
    31  	i.Put(2)
    32  	check(i.Get() == 1, "f1 i")
    33  	check(s.i == 1, "f1 s")
    34  }
    35  
    36  func f2() {
    37  	s := S1{1}
    38  	var i I1 = &s
    39  	i.Put(2)
    40  	check(i.Get() == 1, "f2 i")
    41  	check(s.i == 1, "f2 s")
    42  }
    43  
    44  func f3() {
    45  	s := &S1{1}
    46  	var i I1 = s
    47  	i.Put(2)
    48  	check(i.Get() == 1, "f3 i")
    49  	check(s.i == 1, "f3 s")
    50  }
    51  
    52  type S2 struct { i int }
    53  func (p *S2) Get() int { return p.i }
    54  func (p *S2) Put(i int) { p.i = i }
    55  
    56  // Disallowed by restriction of values going to pointer receivers
    57  // func f4() {
    58  //	 s := S2{1}
    59  //	 var i I1 = s
    60  //	 i.Put(2)
    61  //	 check(i.Get() == 2, "f4 i")
    62  //	 check(s.i == 1, "f4 s")
    63  // }
    64  
    65  func f5() {
    66  	s := S2{1}
    67  	var i I1 = &s
    68  	i.Put(2)
    69  	check(i.Get() == 2, "f5 i")
    70  	check(s.i == 2, "f5 s")
    71  }
    72  
    73  func f6() {
    74  	s := &S2{1}
    75  	var i I1 = s
    76  	i.Put(2)
    77  	check(i.Get() == 2, "f6 i")
    78  	check(s.i == 2, "f6 s")
    79  }
    80  
    81  type I2 interface { Get() int64; Put(int64) }
    82  
    83  type S3 struct { i, j, k, l int64 }
    84  func (p S3) Get() int64 { return p.l }
    85  func (p S3) Put(i int64) { p.l = i }
    86  
    87  func f7() {
    88  	s := S3{1, 2, 3, 4}
    89  	var i I2 = s
    90  	i.Put(5)
    91  	check(i.Get() == 4, "f7 i")
    92  	check(s.l == 4, "f7 s")
    93  }
    94  
    95  func f8() {
    96  	s := S3{1, 2, 3, 4}
    97  	var i I2 = &s
    98  	i.Put(5)
    99  	check(i.Get() == 4, "f8 i")
   100  	check(s.l == 4, "f8 s")
   101  }
   102  
   103  func f9() {
   104  	s := &S3{1, 2, 3, 4}
   105  	var i I2 = s
   106  	i.Put(5)
   107  	check(i.Get() == 4, "f9 i")
   108  	check(s.l == 4, "f9 s")
   109  }
   110  
   111  type S4 struct { i, j, k, l int64 }
   112  func (p *S4) Get() int64 { return p.l }
   113  func (p *S4) Put(i int64) { p.l = i }
   114  
   115  // Disallowed by restriction of values going to pointer receivers
   116  // func f10() {
   117  //	 s := S4{1, 2, 3, 4}
   118  //	 var i I2 = s
   119  //	 i.Put(5)
   120  //	 check(i.Get() == 5, "f10 i")
   121  //	 check(s.l == 4, "f10 s")
   122  // }
   123  
   124  func f11() {
   125  	s := S4{1, 2, 3, 4}
   126  	var i I2 = &s
   127  	i.Put(5)
   128  	check(i.Get() == 5, "f11 i")
   129  	check(s.l == 5, "f11 s")
   130  }
   131  
   132  func f12() {
   133  	s := &S4{1, 2, 3, 4}
   134  	var i I2 = s
   135  	i.Put(5)
   136  	check(i.Get() == 5, "f12 i")
   137  	check(s.l == 5, "f12 s")
   138  }
   139  
   140  func main() {
   141  	f1()
   142  	f2()
   143  	f3()
   144  //	f4()
   145  	f5()
   146  	f6()
   147  	f7()
   148  	f8()
   149  	f9()
   150  //	f10()
   151  	f11()
   152  	f12()
   153  	if fail > 0 {
   154  		os.Exit(1)
   155  	}
   156  }