Initial commit: Go 1.23 release state
This commit is contained in:
146
test/interface/convert.go
Normal file
146
test/interface/convert.go
Normal file
@@ -0,0 +1,146 @@
|
||||
// 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 all the different interface conversion runtime functions.
|
||||
|
||||
package main
|
||||
|
||||
type Stringer interface {
|
||||
String() string
|
||||
}
|
||||
type StringLengther interface {
|
||||
String() string
|
||||
Length() int
|
||||
}
|
||||
type Empty interface{}
|
||||
|
||||
type T string
|
||||
|
||||
func (t T) String() string {
|
||||
return string(t)
|
||||
}
|
||||
func (t T) Length() int {
|
||||
return len(t)
|
||||
}
|
||||
|
||||
type U string
|
||||
|
||||
func (u U) String() string {
|
||||
return string(u)
|
||||
}
|
||||
|
||||
var t = T("hello")
|
||||
var u = U("goodbye")
|
||||
var e Empty
|
||||
var s Stringer = t
|
||||
var sl StringLengther = t
|
||||
var i int
|
||||
var ok bool
|
||||
|
||||
func hello(s string) {
|
||||
if s != "hello" {
|
||||
println("not hello: ", s)
|
||||
panic("fail")
|
||||
}
|
||||
}
|
||||
|
||||
func five(i int) {
|
||||
if i != 5 {
|
||||
println("not 5: ", i)
|
||||
panic("fail")
|
||||
}
|
||||
}
|
||||
|
||||
func true(ok bool) {
|
||||
if !ok {
|
||||
panic("not true")
|
||||
}
|
||||
}
|
||||
|
||||
func false(ok bool) {
|
||||
if ok {
|
||||
panic("not false")
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
// T2I
|
||||
s = t
|
||||
hello(s.String())
|
||||
|
||||
// I2T
|
||||
t = s.(T)
|
||||
hello(t.String())
|
||||
|
||||
// T2E
|
||||
e = t
|
||||
|
||||
// E2T
|
||||
t = e.(T)
|
||||
hello(t.String())
|
||||
|
||||
// T2I again
|
||||
sl = t
|
||||
hello(sl.String())
|
||||
five(sl.Length())
|
||||
|
||||
// I2I static
|
||||
s = sl
|
||||
hello(s.String())
|
||||
|
||||
// I2I dynamic
|
||||
sl = s.(StringLengther)
|
||||
hello(sl.String())
|
||||
five(sl.Length())
|
||||
|
||||
// I2E (and E2T)
|
||||
e = s
|
||||
hello(e.(T).String())
|
||||
|
||||
// E2I
|
||||
s = e.(Stringer)
|
||||
hello(s.String())
|
||||
|
||||
// I2T2 true
|
||||
t, ok = s.(T)
|
||||
true(ok)
|
||||
hello(t.String())
|
||||
|
||||
// I2T2 false
|
||||
_, ok = s.(U)
|
||||
false(ok)
|
||||
|
||||
// I2I2 true
|
||||
sl, ok = s.(StringLengther)
|
||||
true(ok)
|
||||
hello(sl.String())
|
||||
five(sl.Length())
|
||||
|
||||
// I2I2 false (and T2I)
|
||||
s = u
|
||||
sl, ok = s.(StringLengther)
|
||||
false(ok)
|
||||
|
||||
// E2T2 true
|
||||
t, ok = e.(T)
|
||||
true(ok)
|
||||
hello(t.String())
|
||||
|
||||
// E2T2 false
|
||||
i, ok = e.(int)
|
||||
false(ok)
|
||||
|
||||
// E2I2 true
|
||||
sl, ok = e.(StringLengther)
|
||||
true(ok)
|
||||
hello(sl.String())
|
||||
five(sl.Length())
|
||||
|
||||
// E2I2 false (and T2E)
|
||||
e = u
|
||||
sl, ok = e.(StringLengther)
|
||||
false(ok)
|
||||
}
|
||||
Reference in New Issue
Block a user