golang 断言是什么


当前第2页 返回上一页

如以下的代码:

1

2

3

func funcName(a interface{}) string {

     return string(a)

}

编译器将会返回:

1

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

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

直接断言使用

1

2

var a interface{}

fmt.Println("Where are you,Jonny?", a.(string))

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

1

value, ok := a.(string)

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

1

2

3

4

5

6

value, ok := a.(string)

if !ok {

    fmt.Println("It's not ok for type string")

    return

}

fmt.Println("The value is ", value)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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)变量的定义和申明可以用组的方式,如:

1

2

3

4

5

6

7

8

9

10

11

12

var (

   a string

   b int

   c int64

   ...

)

import (

    "fmt"

    "strings"

    "net/http"

   ...

)

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

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

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

以上就是golang 断言是什么的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

多协程通道的应用---三协程通过通道实现abc按顺序输出100次

golang不能隐式转换吗

golang是多线程模式吗?

golang 多版本管理工具 —— gvm | 七日打卡

go语言标准库之context

如何在linux上运行第一个go程序

详解golang中方法的receiver为指针和不为指针的区别

手撸golang go与微服务 net.rpc

golang如何删除文件?

golang实现微信支付v3版本

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...