• 技术文章 >后端开发 >Golang

    golang 断言是什么

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-12-10 09:37:23原创1865

    php入门到就业线上直播课:进入学习

    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 has
    case bool:
        fmt.Printf("boolean %t\n", t)             // t has type bool
    case int:
        fmt.Printf("integer %d\n", t)             // t has type int
    case *bool:
        fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
    case *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入门教程,欢迎大家学习!

    以上就是golang 断言是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:golang 断言
    上一篇:golang中的defer关键字什么时候生效 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Golang Cgo是什么• golang channel是什么• golang flag是什么• golang中的bee是指什么
    1/1

    PHP中文网