| // $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 float |
| 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(slice)); |
| isString(String(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); |
| } |