golang中有哪些类型的断言?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
package main
import (
"github.com/yvasiyarov/php_session_decoder/php_serialize"
"fmt"
"log"
)
func main() {
// 序列化后的字符串
str := `a:3:{s:4:"name";s:3:"tom";s:3:"age";s:2:"23";s:7:"friends";a:2:{i:0;a:1:{s:4:"name";s:5:"jerry";}i:1;a:1:{s:4:"name";s:4:"jack";}}}`
// 反序列化
decoder := php_serialize.NewUnSerializer(str)
if result, err := decoder.Decode(); err != nil {
panic(err)
} else {
// 此处进行类型断言
decodeData, ok := result.(php_serialize.PhpArray)
if !ok {
log.Println(err)
}
// 断言后,即可获取内容
name := decodeData["name"]
age := decodeData["age"]
fmt.Println(name, age)
// 内层数据仍需再次断言
friends, ok := decodeData["friends"].(php_serialize.PhpArray)
if !ok {
log.Println(err)
}
// 断言成功后即可获取内部数据
for _,v := range friends {
fmt.Printf("type:%T, value:%+v\n", v,v )
friend, ok := v.(php_serialize.PhpArray)
if !ok {
log.Println(err)
}
friendName := friend["name"]
fmt.Println(friendName)
}
}
}
可以粗暴的这么理解:一个变量是什么类型,就进行什么类型的断言,断言后,即可得到结果
怎么判断一个变量的类型?
打印出来呀:fmt.Printf("%T", verb)
%T这个占位符可以显示变量的类型
下面还有个示例:
package main
import (
"github.com/yvasiyarov/php_session_decoder/php_serialize"
"fmt"
"log"
)
func main() {
// 序列化后的字符串
str := `a:3:{s:4:"name";s:3:"tom";s:3:"age";s:2:"23";s:7:"friends";a:2:{i:0;a:1:{s:4:"name";s:5:"jerry";}i:1;a:1:{s:4:"name";s:4:"jack";}}}`
// 反序列化
decoder := php_serialize.NewUnSerializer(str)
result, err := decoder.Decode()
if err != nil {
panic(err)
}
// 类型断言
t := result.(php_serialize.PhpArray)
strVal := php_serialize.PhpValueString(t["name"])
fmt.Println(strVal)
switch t := result.(type) {
default:
fmt.Printf("unexpected type %T\n", t)
case php_serialize.PhpArray:
fmt.Println(t)
fmt.Println(t["name"])
fmt.Println(t["age"])
switch f := t["friends"].(type) {
default:
fmt.Printf("unexpected type %T\n", t)
case php_serialize.PhpArray:
fmt.Println(f)
fmt.Println(f[0])
fmt.Println(f[1])
}
}
}
上面两个demo都可以达到效果,只是写法不同。
后面我又经人介绍,得到了另外一个包,也能达到效果:
package main
import (
"fmt"
"log"
"github.com/wulijun/go-php-serialize/phpserialize"
)
func main() {
str := `a:3:{s:4:"name";s:3:"tom";s:3:"age";s:2:"23";s:7:"friends";a:2:{i:0;a:1:{s:4:"name";s:5:"jerry";}i:1;a:1:{s:4:"name";s:4:"jack";}}}`
decodedRes, err := phpserialize.Decode(str)
if err != nil {
panic(err)
}
//fmt.Printf("%T\n", decodedRes) //type is map[interface{}]interface{}
//type assert
decodedData, ok := decodedRes.(map[interface{}]interface{})
if !ok {
fmt.Printf("unexpected type %T\n", decodedRes)
}
fmt.Println(decodedData["name"])
fmt.Println(decodedData["age"])
//fmt.Printf("%T\n", decodedData["friends"]) // type is map[interface{}]interface{}
// type assert
friendsRes, ok := decodedData["friends"].(map[interface{}]interface{})
if !ok {
fmt.Printf("unexpected type %T\n", decodedData["friends"])
}
for _,v := range friendsRes {
//fmt.Printf("type: %T, val: %#v\n", v,v) // type is map[interface{}]interface{}
friend, ok := v.(map[interface{}]interface{})
if !ok {
fmt.Printf("unexpected type %T\n", decodedData["friends"])
}
//fmt.Printf("type: %T, val: %#v\n", friend,friend) // type is map[interface{}]interface{}
fmt.Println(friend["name"])
}
}
golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。