mirror of
https://github.com/golang/go
synced 2024-11-24 10:30:10 -07:00
565b5dc076
* Code for assignment, conversions now mirrors spec. * Changed some snprint -> smprint. * Renamed runtime functions to separate interface conversions from type assertions: convT2I, assertI2T, etc. * Correct checking of \U sequences. Fixes #840. Fixes #830. Fixes #778. R=ken2 CC=golang-dev https://golang.org/cl/1303042
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([]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)
|
|
}
|