时间:2023-03-09来源:系统城装机大师作者:佚名
我们一起来回顾一下上一次说到的 interface{}
这里顺便说一下,用来作态需要满足这样的条件:
正常的使用断言,写一个简单的 断言 demo
1 2 3 4 5 6 7 8 9 10 |
type Animal interface {} func main() { var a Animal = "xiaomotong" v, ok := a.( string ) if !ok{ fmt. Println ( "type error" ) } fmt. Println ( "v == " ,v) } |
断言注意写成 2 个返回值的,一个是具体的值,一个是 bool,判断断言是否成功,若成功则说明断言正确,且 v 会被赋值为实际变量的值
切忌没头脑的强转
1 2 3 4 5 6 |
func main() { var a Animal = "xiaomotong" v := a.( int ) fmt. Println ( "v == " ,v) } |
上述这种写法,若不判断是否断言成功,直接强转,程序是会 panic 的 ,执行上述程序后效果如下:
>go run main.go
panic: interface conversion: main.Animal is string, not int
goroutine 1 [running]:
main.main()
D:/mycode/my_new_first/interface_test/main.go:13 +0x4c
exit status 2
程序崩掉,那就是线上问题了 xdm ,这里需要注意
当然我们也可以这样写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
type Animal interface {} func main() { var a Animal = "xiaomotong" switch a.( type ) { case string : fmt. Println ( "a type is string" ) case int : fmt. Println ( "a type is int" ) } } |
通过 switch 的方式来判断 接口的数据类型,根据不同的数据类型来做不同的事情,进行分类处理
golang 里面有反射这个概念,简单来说,咱们可以通过反射包来实现获取接口真实的类型,和真实的数据
举个小例子:
通过反射来获取 Animal 接口的数据类型,和具体的数据值
1 2 3 4 5 6 7 |
type Animal interface {} func main() { var a Animal = "xiaomotong" v := reflect.ValueOf(a) fmt.Printf( "v type == " , v. Type (), " v == " , v. String ()) } |
执行上述代码后效果如下:
> go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
没毛病正常获取,但是如果我们这样写的话是不是也可以正确执行呢?
1 2 3 4 5 6 7 |
type Animal interface{} func main() { var a Animal = "xiaomotong" v := reflect.ValueOf(a) fmt.Printf("v type == ", v.Type(), " v == ", v.Int()) } |
看这个例子也就和上面的例子相差在输出的时候,一个是v.String()
,一个是v.Int()
,可是结果却相差很大
go run main.go
v type == %!(EXTRA *reflect.rtype=string, string= v == , string=xiaomotong)
D:\mycode\my_new_first\interface_test>go run main.go
panic: reflect: call of reflect.Value.Int on string Value
goroutine 1 [running]:
reflect.Value.Int(...)
C:/Program Files/Go/src/reflect/value.go:999
main.main()
D:/mycode/my_new_first/interface_test/main.go:26 +0x2bd
exit status 2
执行上述代码,go 程序给我们报了 panic 错误,这里需要注意 ,程序崩溃的原因是,我们将一个 string 类型的值反射成一个 Int 类型的值,直接在 反射包里面就给我们报了 panic
到此这篇关于这些关于Go中interface{}的注意事项你都了解吗的文章就介绍到这了
2024-07-16
如何使用 Go 依赖库管理器修复损坏的依赖项?2024-07-07
Java框架如何简化代码的调试过程2023-03-17
Python 使用tf-idf算法计算文档关键字权重并生成词云的方法有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...
2023-03-15
由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...
2023-03-09