golang判断接口变的类型与指针切片使用法(重要)
package main
import (
"fmt"
"strconv"
)
func Demo() (s *[]string){
s = new([]string) // s = &[]string{}
return s
}
func main() {
var s interface{}= "test"
if _,ok:=interface{}(s).(string);ok{
fmt.Println("ok")
}
switch v:=s.(type) {
case string:
fmt.Println(v)
case int:
strconv.Itoa(v)
}
fmt.Println(Demo())
}
判断container的类型
打印其中的元素之前,正确判断变量的类型,使用“类型断言”表达式。
value, ok := interface{}(container).([]string)
var obj string
tp := fmt.Sprintf("%T", obj)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package main import ( "fmt" "math/rand" "time" ) func main() { var v interface{} r := rand .New( rand .NewSource( time .Now().UnixNano())) for i := 0; i < 10; i++{ v = i if (r.Intn(100) % 2) == 0 { v = "hello" } if _, ok := v.( int ); ok { fmt.Printf( "%d\n" , v) } } } |
ok是bool类型得,它代表判断的结果true或者false。如果是true,那么被判断的值将会被自动转换为[]string,并赋值给变量value,否则value将被赋值为nil。ok也可以没有,断言表达式的结果,可以只赋给一个变量value,但是这种情况,如果判断为否就会引发异常,panic(运行时抛出的异常),除非显式地恢复这种恐慌,否则它会使go程序崩溃并停止。所以,在一般情况下,应该使用带ok变量的写法。
类型断言
类型断言表达式的语法形式是x.(T),其中x代表要被判断类型的值,这个值当下必须是接口类型的,具体是哪个接口类型无所谓。上面的container变量类型不是任何的接口类型时,应该把它转成某个接口类型的值。如果container时某个接口类型了,那么断言表达式就可以式container.([]string)。
go语言中,interface{}代表空接口,任何类型都是它的实现类型。任何类型的值都可以很方便地被转化成空接口的值。一对不包裹任何东西的花括号,除了可以代表空的代码块之外,还可以用于表示不包含任何内容的数据结构(或者说数据类型)。struct{},代表了不包含任何字段和方法的、空的结构体类型。而空接口interface{}则表达了不包含任何方法定义的、空的接口类型。一些集合类的数据类型来说,{}还可以用来表达其值不包含任何元素,比如空的切片值[]string{},以及空的字典值map[int]string{}。
类型转换
类型转换表达式的语法形式T(x)。其中x可以是一个变量,也可以是一个代表值的字面量(如1.2和struct{}),还可以是一个表达式。如果是表达式,那么该表达式的结果只能是一个值,而不能是多个值。在这个上下文中,x可以被叫做源值,它的类型就是源类型,而那个T代表的类型就是目标类型。
interface{}(container)
源值是container变量,目标类型是interface{}
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2021-04-07 ansible playbook -include
2021-04-07 Ansible Playbook循环语句
2021-04-07 ansible非role格式
2021-04-07 ansible playbook如何处理错误(block-rescue-always)
2021-04-07 ansible 批量更新 nginx 配置,以及失败时的自动回滚样例
2021-04-07 systemctl启动服务时,配置日志输出控制