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)

 

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{}

posted @ 2022-04-07 17:52  技术颜良  阅读(446)  评论(0编辑  收藏  举报