Go语言里面有一个语法,可以直接判断是否是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。

如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

package main import (  "fmt") type Order struct {  ordId   int  customerId int  callback func()} func main() {  var i interface{}  i = Order{    ordId:   456,    customerId: 56,  }  value, ok := i.(Order)  if !ok {    fmt.Println("It's not ok for type Order")    return  }  fmt.Println("The value is ", value)}

输出:

The value is  {456 56 <nil>}

常见的还有用switch来断言:

package main import (  "fmt") type Order struct {  ordId   int  customerId int  callback func()} func main() {  var i interface{}  i = Order{    ordId:   456,    customerId: 56,  }  switch value := i.(type) {    case int:      fmt.Printf("It is an int and its value is %d\n", value)    case string:      fmt.Printf("It is a string and its value is %s\n", value)    case Order:      fmt.Printf("It is a Order and its value is %v\n", value)    default:      fmt.Println("It is of a different type")    }}

输出:

It is a Order and its value is {456 56 <nil>}

golang的语言中提供了断言的功能。golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口,这种做法和java中的Object类型比较类似。那么在一个数据通过func funcName(interface{})的方式传进来的时候,也就意味着这个参数被自动的转为interface{}的类型。

如以下的代码:

func funcName(a interface{}) string {     return string(a)}

编译器将会返回:

cannot convert a (type interface{}) to type string: need type assertion

此时,意味着整个转化的过程需要类型断言。类型断言有以下几种形式:

直接断言使用

var a interface{}fmt.Println("Where are you,Jonny?", a.(string))

但是如果断言失败一般会导致panic的发生。所以为了防止panic的发生,我们需要在断言前进行一定的判断。

value, ok := a.(string)

如果断言失败,那么ok的值将会是false,但是如果断言成功ok的值将会是true,同时value将会得到所期待的正确的值。示例:

value, ok := a.(string)if !ok {    fmt.Println("It's not ok for type string")    return}fmt.Println("The value is ", value)

另外也可以配合switch语句进行判断:

var t interface{}t = functionOfSomeType()switch t := t.(type) {default:    fmt.Printf("unexpected type %T", t)       // %T prints whatever type t hascase bool:    fmt.Printf("boolean %t\n", t)             // t has type boolcase int:    fmt.Printf("integer %d\n", t)             // t has type intcase *bool:    fmt.Printf("pointer to boolean %t\n", *t) // t has type *boolcase *int:    fmt.Printf("pointer to integer %d\n", *t) // t has type *int}

另外补充几个go语言编程的小tips:

(1)如果不符合要求可以尽快的return(return as fast as you can),而减少else语句的使用,这样可以更加直观一些。

(2)转换类型的时候如果是string可以不用断言,使用fmt.Sprint()函数可以达到想要的效果。

(3)变量的定义和申明可以用组的方式,如:

var (   a string   b int   c int64   ...)import (    "fmt"    "strings"    "net/http"   ...)

(4)函数逻辑比较复杂,可以把一些逻辑封装成一个函数,提高可读性。

(5)使用net/http包和net/url包的函数,可能会带有url encode功能,需要注意。

PHP中文网,有大量免费的Golang入门教程,欢迎大家学习!

更多相关文章

  1. golang如何判断数据类型
  2. golang数据类型有哪些
  3. golang 如何类型转换
  4. go语言数据类型转换教程
  5. golang怎么把字符串转成Int类型
  6. golang判断错误类型的方法
  7. 详解 Go 中的不可变类型
  8. 总结 Go 的数据类型
  9. 详解Golang中函数作为值与类型

随机推荐

  1. Android中自定义控件和属性
  2. Android Launcher 分析
  3. Android之RelativeLayout属性
  4. Android 相对布局 RelativeLayout 属性
  5. 创建和使用Android(安卓)library工程
  6. android修改手机虚拟设备管理器路径
  7. android studio 使用adb命令传递文件到an
  8. Android与js交互实例
  9. Unity与Android的互相调用
  10. Android(安卓)平台软件兼容性问题凸显