|  | // $G $D/$F.go && $L $F.$A && ./$A.out | 
|  |  | 
|  | // Copyright 2009 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. | 
|  |  | 
|  | // Test that basic operations on named types are valid | 
|  | // and preserve the type. | 
|  |  | 
|  | package main | 
|  |  | 
|  | type Array [10]byte | 
|  | type Bool bool | 
|  | type Chan chan int | 
|  | type Float float32 | 
|  | type Int int | 
|  | type Map map[int]byte | 
|  | type Slice []byte | 
|  | type String string | 
|  |  | 
|  | // Calling these functions checks at compile time that the argument | 
|  | // can be converted implicitly to (used as) the given type. | 
|  | func asArray(Array)   {} | 
|  | func asBool(Bool)     {} | 
|  | func asChan(Chan)     {} | 
|  | func asFloat(Float)   {} | 
|  | func asInt(Int)       {} | 
|  | func asMap(Map)       {} | 
|  | func asSlice(Slice)   {} | 
|  | func asString(String) {} | 
|  |  | 
|  | func (Map) M() {} | 
|  |  | 
|  |  | 
|  | // These functions check at run time that the default type | 
|  | // (in the absence of any implicit conversion hints) | 
|  | // is the given type. | 
|  | func isArray(x interface{})  { _ = x.(Array) } | 
|  | func isBool(x interface{})   { _ = x.(Bool) } | 
|  | func isChan(x interface{})   { _ = x.(Chan) } | 
|  | func isFloat(x interface{})  { _ = x.(Float) } | 
|  | func isInt(x interface{})    { _ = x.(Int) } | 
|  | func isMap(x interface{})    { _ = x.(Map) } | 
|  | func isSlice(x interface{})  { _ = x.(Slice) } | 
|  | func isString(x interface{}) { _ = x.(String) } | 
|  |  | 
|  | func main() { | 
|  | var ( | 
|  | a     Array | 
|  | b     Bool   = true | 
|  | c     Chan   = make(Chan) | 
|  | f     Float  = 1 | 
|  | i     Int    = 1 | 
|  | m     Map    = make(Map) | 
|  | slice Slice  = make(Slice, 10) | 
|  | str   String = "hello" | 
|  | ) | 
|  |  | 
|  | asArray(a) | 
|  | isArray(a) | 
|  | asArray(*&a) | 
|  | isArray(*&a) | 
|  | asArray(Array{}) | 
|  | isArray(Array{}) | 
|  |  | 
|  | asBool(b) | 
|  | isBool(b) | 
|  | asBool(!b) | 
|  | isBool(!b) | 
|  | asBool(true) | 
|  | asBool(*&b) | 
|  | isBool(*&b) | 
|  | asBool(Bool(true)) | 
|  | isBool(Bool(true)) | 
|  |  | 
|  | asChan(c) | 
|  | isChan(c) | 
|  | asChan(make(Chan)) | 
|  | isChan(make(Chan)) | 
|  | asChan(*&c) | 
|  | isChan(*&c) | 
|  | asChan(Chan(nil)) | 
|  | isChan(Chan(nil)) | 
|  |  | 
|  | asFloat(f) | 
|  | isFloat(f) | 
|  | asFloat(-f) | 
|  | isFloat(-f) | 
|  | asFloat(+f) | 
|  | isFloat(+f) | 
|  | asFloat(f + 1) | 
|  | isFloat(f + 1) | 
|  | asFloat(1 + f) | 
|  | isFloat(1 + f) | 
|  | asFloat(f + f) | 
|  | isFloat(f + f) | 
|  | f++ | 
|  | f += 2 | 
|  | asFloat(f - 1) | 
|  | isFloat(f - 1) | 
|  | asFloat(1 - f) | 
|  | isFloat(1 - f) | 
|  | asFloat(f - f) | 
|  | isFloat(f - f) | 
|  | f-- | 
|  | f -= 2 | 
|  | asFloat(f * 2.5) | 
|  | isFloat(f * 2.5) | 
|  | asFloat(2.5 * f) | 
|  | isFloat(2.5 * f) | 
|  | asFloat(f * f) | 
|  | isFloat(f * f) | 
|  | f *= 4 | 
|  | asFloat(f / 2.5) | 
|  | isFloat(f / 2.5) | 
|  | asFloat(2.5 / f) | 
|  | isFloat(2.5 / f) | 
|  | asFloat(f / f) | 
|  | isFloat(f / f) | 
|  | f /= 4 | 
|  | asFloat(f) | 
|  | isFloat(f) | 
|  | f = 5 | 
|  | asFloat(*&f) | 
|  | isFloat(*&f) | 
|  | asFloat(234) | 
|  | asFloat(Float(234)) | 
|  | isFloat(Float(234)) | 
|  | asFloat(1.2) | 
|  | asFloat(Float(i)) | 
|  | isFloat(Float(i)) | 
|  |  | 
|  | asInt(i) | 
|  | isInt(i) | 
|  | asInt(-i) | 
|  | isInt(-i) | 
|  | asInt(^i) | 
|  | isInt(^i) | 
|  | asInt(+i) | 
|  | isInt(+i) | 
|  | asInt(i + 1) | 
|  | isInt(i + 1) | 
|  | asInt(1 + i) | 
|  | isInt(1 + i) | 
|  | asInt(i + i) | 
|  | isInt(i + i) | 
|  | i++ | 
|  | i += 1 | 
|  | asInt(i - 1) | 
|  | isInt(i - 1) | 
|  | asInt(1 - i) | 
|  | isInt(1 - i) | 
|  | asInt(i - i) | 
|  | isInt(i - i) | 
|  | i-- | 
|  | i -= 1 | 
|  | asInt(i * 2) | 
|  | isInt(i * 2) | 
|  | asInt(2 * i) | 
|  | isInt(2 * i) | 
|  | asInt(i * i) | 
|  | isInt(i * i) | 
|  | i *= 2 | 
|  | asInt(i / 5) | 
|  | isInt(i / 5) | 
|  | asInt(5 / i) | 
|  | isInt(5 / i) | 
|  | asInt(i / i) | 
|  | isInt(i / i) | 
|  | i /= 2 | 
|  | asInt(i % 5) | 
|  | isInt(i % 5) | 
|  | asInt(5 % i) | 
|  | isInt(5 % i) | 
|  | asInt(i % i) | 
|  | isInt(i % i) | 
|  | i %= 2 | 
|  | asInt(i & 5) | 
|  | isInt(i & 5) | 
|  | asInt(5 & i) | 
|  | isInt(5 & i) | 
|  | asInt(i & i) | 
|  | isInt(i & i) | 
|  | i &= 2 | 
|  | asInt(i &^ 5) | 
|  | isInt(i &^ 5) | 
|  | asInt(5 &^ i) | 
|  | isInt(5 &^ i) | 
|  | asInt(i &^ i) | 
|  | isInt(i &^ i) | 
|  | i &^= 2 | 
|  | asInt(i | 5) | 
|  | isInt(i | 5) | 
|  | asInt(5 | i) | 
|  | isInt(5 | i) | 
|  | asInt(i | i) | 
|  | isInt(i | i) | 
|  | i |= 2 | 
|  | asInt(i ^ 5) | 
|  | isInt(i ^ 5) | 
|  | asInt(5 ^ i) | 
|  | isInt(5 ^ i) | 
|  | asInt(i ^ i) | 
|  | isInt(i ^ i) | 
|  | i ^= 2 | 
|  | asInt(i << 4) | 
|  | isInt(i << 4) | 
|  | i <<= 2 | 
|  | asInt(i >> 4) | 
|  | isInt(i >> 4) | 
|  | i >>= 2 | 
|  | asInt(i) | 
|  | isInt(i) | 
|  | asInt(0) | 
|  | asInt(Int(0)) | 
|  | isInt(Int(0)) | 
|  | i = 10 | 
|  | asInt(*&i) | 
|  | isInt(*&i) | 
|  | asInt(23) | 
|  | asInt(Int(f)) | 
|  | isInt(Int(f)) | 
|  |  | 
|  | asMap(m) | 
|  | isMap(m) | 
|  | asMap(nil) | 
|  | m = nil | 
|  | asMap(make(Map)) | 
|  | isMap(make(Map)) | 
|  | asMap(*&m) | 
|  | isMap(*&m) | 
|  | asMap(Map(nil)) | 
|  | isMap(Map(nil)) | 
|  | asMap(Map{}) | 
|  | isMap(Map{}) | 
|  |  | 
|  | asSlice(slice) | 
|  | isSlice(slice) | 
|  | asSlice(make(Slice, 5)) | 
|  | isSlice(make(Slice, 5)) | 
|  | asSlice([]byte{1, 2, 3}) | 
|  | asSlice([]byte{1, 2, 3}[0:2]) | 
|  | asSlice(slice[0:4]) | 
|  | isSlice(slice[0:4]) | 
|  | asSlice(slice[3:8]) | 
|  | isSlice(slice[3:8]) | 
|  | asSlice(nil) | 
|  | asSlice(Slice(nil)) | 
|  | isSlice(Slice(nil)) | 
|  | slice = nil | 
|  | asSlice(Slice{1, 2, 3}) | 
|  | isSlice(Slice{1, 2, 3}) | 
|  | asSlice(Slice{}) | 
|  | isSlice(Slice{}) | 
|  | asSlice(*&slice) | 
|  | isSlice(*&slice) | 
|  |  | 
|  | asString(str) | 
|  | isString(str) | 
|  | asString(str + "a") | 
|  | isString(str + "a") | 
|  | asString("a" + str) | 
|  | isString("a" + str) | 
|  | asString(str + str) | 
|  | isString(str + str) | 
|  | str += "a" | 
|  | str += str | 
|  | asString(String('a')) | 
|  | isString(String('a')) | 
|  | asString(String([]byte(slice))) | 
|  | isString(String([]byte(slice))) | 
|  | asString(String([]byte(nil))) | 
|  | isString(String([]byte(nil))) | 
|  | asString("hello") | 
|  | asString(String("hello")) | 
|  | isString(String("hello")) | 
|  | str = "hello" | 
|  | isString(str) | 
|  | asString(*&str) | 
|  | isString(*&str) | 
|  | } |