| // run | |
| // 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) | |
| } |