Go-类型断言
2014-06-11 14:30
253 查看
Java当中有instanceof这样的关键字判断类型 Go当中自然也有相应的方法来判断类型
即Comma-ok断言
写法为value, ok := em.(T) 如果确保em 是同类型的时候可以直接使用value:=em.(T)一般用于switch语句中下面将会讲解到
em代表要判断的变量
T代表被判断的类型
value代表返回的值
ok代表是否为改类型
类型断言应该一看就懂 在这里就不再介绍了主要是介绍我自己碰到的几个问题
1 em必须为initerface类型才可以进行类型断言
比如如下代码会报错
s := "BrainWu"
if v, ok := s.(string); ok {
fmt.Println(v)
}
invalid type assertion: s.(string) (non-interface type string on left)
在这里只要是在声明时或函数传进来的参数不是interface类型那么做类型断言都是回报 non-interface的错误的
所以我们只能通过将s作为一个interface{}的方法来进行类型断言 如下代码所示
s := "BrainWu"
if v, ok := interface{}(s).(string); ok {
fmt.Println(v)
}将s显示的转换为interface{}接口类型则可以进行类型断言了
2 当函数作为参数并且被调用函数将参数类型指定为interface{}的时候是没有办法直接调用该方法的
比如如下代码是错误的在编译期间就会报错
cannot convert in (type interface {}) to type Handler: need type assertion
func ServeHTTP(s string) {
fmt.Println(s)
}
type Handler func(string)
func panduan(in interface{}) {
Handler(in)("wujunbin")
}
func main() {
panduan(Handler(ServeHTTP))
}
根据错误提示是说要我们先进行类型断言才可以继续使用该类型的函数
另外进行类型断言之后如果断言成功 就只能使用该类型的方法比如对一个结构体S进行与A接口断言
S实际上实现了A B两个接口
A interface 具有 a()方法 B interface 具有 b()方法 如果结构体S作为参数被传入一个函数中并且在该函数中是interface{}类型
那么进行与A的类型断言之后就只能调用a()而不能调用b()因为编译器只知道你目前是A类型却不知道你目前也是B类型
3 另外讲解 switch与类型断言的结合使用还是比较方便的
比如下面这个例子
package main
import (
"fmt"
)
type Element interface {}
func main() {
var e Element = 100
switch value := e.(type) {
case int:
fmt.Println("int", value)
case string:
fmt.Println("string", value)
default:
fmt.Println("unknown", value)
}
}
type是一个关键字
即Comma-ok断言
写法为value, ok := em.(T) 如果确保em 是同类型的时候可以直接使用value:=em.(T)一般用于switch语句中下面将会讲解到
em代表要判断的变量
T代表被判断的类型
value代表返回的值
ok代表是否为改类型
类型断言应该一看就懂 在这里就不再介绍了主要是介绍我自己碰到的几个问题
1 em必须为initerface类型才可以进行类型断言
比如如下代码会报错
s := "BrainWu"
if v, ok := s.(string); ok {
fmt.Println(v)
}
invalid type assertion: s.(string) (non-interface type string on left)
在这里只要是在声明时或函数传进来的参数不是interface类型那么做类型断言都是回报 non-interface的错误的
所以我们只能通过将s作为一个interface{}的方法来进行类型断言 如下代码所示
s := "BrainWu"
if v, ok := interface{}(s).(string); ok {
fmt.Println(v)
}将s显示的转换为interface{}接口类型则可以进行类型断言了
2 当函数作为参数并且被调用函数将参数类型指定为interface{}的时候是没有办法直接调用该方法的
比如如下代码是错误的在编译期间就会报错
cannot convert in (type interface {}) to type Handler: need type assertion
func ServeHTTP(s string) {
fmt.Println(s)
}
type Handler func(string)
func panduan(in interface{}) {
Handler(in)("wujunbin")
}
func main() {
panduan(Handler(ServeHTTP))
}
根据错误提示是说要我们先进行类型断言才可以继续使用该类型的函数
if v, ok := in.(Handler); ok { //跟什么类型判断就只能调用什么类型的方法 v("BrainWu") }只有让传进来的in参数先与Handler进行类型判断 如果返回值是OK则代表类型相同才能进行对应的方法调用
另外进行类型断言之后如果断言成功 就只能使用该类型的方法比如对一个结构体S进行与A接口断言
S实际上实现了A B两个接口
A interface 具有 a()方法 B interface 具有 b()方法 如果结构体S作为参数被传入一个函数中并且在该函数中是interface{}类型
那么进行与A的类型断言之后就只能调用a()而不能调用b()因为编译器只知道你目前是A类型却不知道你目前也是B类型
3 另外讲解 switch与类型断言的结合使用还是比较方便的
比如下面这个例子
package main
import (
"fmt"
)
type Element interface {}
func main() {
var e Element = 100
switch value := e.(type) {
case int:
fmt.Println("int", value)
case string:
fmt.Println("string", value)
default:
fmt.Println("unknown", value)
}
}
type是一个关键字
相关文章推荐
- GO断言来转换数据类型
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型
- GO 类型断言
- GO类型断言
- go语言的类型断言(Type Assertion)
- Go的类型断言解析
- GO语言类型转换和类型断言实例分析
- go类型断言
- GO语言总结(5)——类型转换和类型断言
- Go interface{}、类型断言
- Go基础系列:接口类型断言和type-switch
- GO: 类型断言
- Go 的类型断言type assertion
- Go(6 [接口 类型断言])
- Go 常量、init、数组、类型转换与断言、Recover
- Go各种类型转换及函数的高级用法
- 【Go入门教程3】基本类型 和 高级类型
- 详解Go中Map类型和Slice类型的传递
- Go语言string,int,int64 ,float之间类型转换方法
- Go中的数据类型