github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/bug027.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  package main
     8  
     9  import "fmt"
    10  
    11  type Element interface {
    12  }
    13  
    14  type Vector struct {
    15  	nelem int
    16  	elem  []Element
    17  }
    18  
    19  func New() *Vector {
    20  	v := new(Vector)
    21  	v.nelem = 0
    22  	v.elem = make([]Element, 10)
    23  	return v
    24  }
    25  
    26  func (v *Vector) At(i int) Element {
    27  	return v.elem[i]
    28  }
    29  
    30  func (v *Vector) Insert(e Element) {
    31  	v.elem[v.nelem] = e
    32  	v.nelem++
    33  }
    34  
    35  func main() {
    36  	type I struct{ val int }
    37  	i0 := new(I)
    38  	i0.val = 0
    39  	i1 := new(I)
    40  	i1.val = 11
    41  	i2 := new(I)
    42  	i2.val = 222
    43  	i3 := new(I)
    44  	i3.val = 3333
    45  	i4 := new(I)
    46  	i4.val = 44444
    47  	v := New()
    48  	r := "hi\n"
    49  	v.Insert(i4)
    50  	v.Insert(i3)
    51  	v.Insert(i2)
    52  	v.Insert(i1)
    53  	v.Insert(i0)
    54  	for i := 0; i < v.nelem; i++ {
    55  		var x *I
    56  		x = v.At(i).(*I)
    57  		r += fmt.Sprintln(i, x.val) // prints correct list
    58  	}
    59  	for i := 0; i < v.nelem; i++ {
    60  		r += fmt.Sprintln(i, v.At(i).(*I).val)
    61  	}
    62  	expect := `hi
    63  0 44444
    64  1 3333
    65  2 222
    66  3 11
    67  4 0
    68  0 44444
    69  1 3333
    70  2 222
    71  3 11
    72  4 0
    73  `
    74  	if r != expect {
    75  		panic(r)
    76  	}
    77  }
    78  
    79  /*
    80  bug027.go:50: illegal types for operand
    81  	(<Element>I{}) CONV (<I>{})
    82  bug027.go:50: illegal types for operand
    83  	(<Element>I{}) CONV (<I>{})
    84  */