interface 转换的例子
注意的地方:
- 由于一般interface 的函数签名那个对象的类型用的都是指针,所以 也要那个类型的指针才能转成接口类型,换个角度看,如果把对象看成是函数的第一个参数,只有第一个参数的类型才能转换成接口类型
- 强转时后面加个ok,才不会panic。这点和 chan close/map key不存在的情况不同(chan 和 map 不加ok也不会panic 只会返回零值)
package main
import (
"fmt"
"errors"
)
type MyError struct {
Msg string
}
func (e *MyError) Error() string {
return "Error:" + e.Msg
}
func main() {
e := errors.New(" new error 1")
myError := &MyError{
Msg: "test",
}
fmt.Printf("%v\n", e)
fmt.Printf("%v\n", myError)
var x interface{} = myError
e1, ok := x.(error)
fmt.Println(e1, ok)
e2, ok := e1.(*MyError)
fmt.Println(e2, ok)
// panic
//e3:=e.(*MyError)
//fmt.Println(e3)
e3, _ := e.(*MyError)
fmt.Println(e3)
e4, ok := e.(*MyError)
fmt.Println(e4,ok)
}
https://www.linuxidc.com/Linux/2014-02/96095.htm
和c++不同的地方在于指针是无法强制转换的,除非用unsafe
这篇中有个类型强转后,访问私有成员的例子
func typeTest() {
var x int=10
var px *int=&x
fmt.Println(px)
var y int32=int32(x)
//var py *int32=(*int32)(px)//compile error
//var py *int32=interface{}(px).(*int)//runtime error
var py *int32=(*int32)(unsafe.Pointer(px))
fmt.Println(y)
fmt.Println(py)
fmt.Println(*py)
fmt.Println(strconv.IntSize)//go 中int的size 是由ARCH决定的,amd64下就是64位
fmt.Println(runtime.GOARCH)
//example of lost
var t int=257
var pt *int8=(*int8)(unsafe.Pointer(&t))
fmt.Println(t)
fmt.Println(*pt)
}
/*output
0xc420078288
10
0xc420078288
10
64
amd64
257
1
*/