请选择 进入手机版 | 继续访问电脑版

云悦之端产品交流论坛

找回密码
立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
发新帖

467

积分

0

好友

33

主题
发表于 2017-9-12 15:01:04 | 查看: 78| 回复: 0
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 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功能,需要注意

参考内容
http://golang.org/doc/effective_go.html?h=type+assertion

本文来自:CSDN博客
感谢作者:JonnyHsu


测试签名
您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|云悦之端 ( 闽ICP备14015107号-1  

GMT+8, 2017-11-23 03:56 , Processed in 0.016544 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表