mirror of
https://github.com/golang/go
synced 2024-11-13 17:40:23 -07:00
78ebe2b392
R=r DELTA=81 (57 added, 24 deleted, 0 changed) OCL=34991 CL=34996
282 lines
4.6 KiB
Go
282 lines
4.6 KiB
Go
// $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);
|
|
}
|