加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang断言的使用(Type Assertion)

发布时间:2020-12-16 18:48:11 所属栏目:大数据 来源:网络整理
导读:golang的语言中提供了断言的功能。golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口,这种做法和java中的Object类型比较类似。那么在一个数据通过func funcName

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

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

1)直接断言使用

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 %tn",t)             // t has type bool
case int:
    fmt.Printf("integer %dn",t)             // t has type int
case *bool:
    fmt.Printf("pointer to boolean %tn",*t) // t has type *bool
case *int:
    fmt.Printf("pointer to integer %dn",*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功能,需要注意


参考内容

http://golang.org/doc/effective_go.html?h=type+assertion

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读