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 the internal "algorithms" for objects larger than a word: hashing, equality etc. 8 9package main 10 11type T struct { 12 a float64 13 b int64 14 c string 15 d byte 16} 17 18var a = []int{ 1, 2, 3 } 19var NIL []int 20 21func arraycmptest() { 22 if NIL != nil { 23 println("fail1:", NIL, "!= nil") 24 } 25 if nil != NIL { 26 println("fail2: nil !=", NIL) 27 } 28 if a == nil || nil == a { 29 println("fail3:", a, "== nil") 30 } 31} 32 33func SameArray(a, b []int) bool { 34 if len(a) != len(b) || cap(a) != cap(b) { 35 return false 36 } 37 if len(a) > 0 && &a[0] != &b[0] { 38 return false 39 } 40 return true 41} 42 43var t = T{1.5, 123, "hello", 255} 44var mt = make(map[int]T) 45var ma = make(map[int][]int) 46 47func maptest() { 48 mt[0] = t 49 t1 := mt[0] 50 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { 51 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) 52 } 53 54 ma[1] = a 55 a1 := ma[1] 56 if !SameArray(a, a1) { 57 println("fail: map val array", a, a1) 58 } 59} 60 61var ct = make(chan T) 62var ca = make(chan []int) 63 64func send() { 65 ct <- t 66 ca <- a 67} 68 69func chantest() { 70 go send() 71 72 t1 := <-ct 73 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { 74 println("fail: map val struct", t1.a, t1.b, t1.c, t1.d) 75 } 76 77 a1 := <-ca 78 if !SameArray(a, a1) { 79 println("fail: map val array", a, a1) 80 } 81} 82 83type E struct { } 84var e E 85 86func interfacetest() { 87 var i interface{} 88 89 i = a 90 a1 := i.([]int) 91 if !SameArray(a, a1) { 92 println("interface <-> []int", a, a1) 93 } 94 pa := new([]int) 95 *pa = a 96 i = pa 97 a1 = *i.(*[]int) 98 if !SameArray(a, a1) { 99 println("interface <-> *[]int", a, a1) 100 } 101 102 i = t 103 t1 := i.(T) 104 if t1.a != t.a || t1.b != t.b || t1.c != t.c || t1.d != t.d { 105 println("interface <-> struct", t1.a, t1.b, t1.c, t1.d) 106 } 107 108 i = e 109 e1 := i.(E) 110 // nothing to check; just verify it doesn't crash 111 _ = e1 112} 113 114func main() { 115 arraycmptest() 116 maptest() 117 chantest() 118 interfacetest() 119} 120