简单介绍下 comma-okswitch 用来判定变量类型

上篇博客介绍了接口,接口在实际应用中可以当做一个万用变量来用,可以用一个空接口来存储多种类型的变量 但是,当我们需要取出来用的时候就要头疼一下取出的到底是哪种类型的数据了

comma-ok

value, ok := element.(type) element 就是我们要判断的变量,括号中是要判断的类型, value 就是变量的值,ok 是 bool 类型,true||false

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import (
	"fmt"
	"strconv"
)

type Element interface{} //定义一个空接口
type List []Element      //定义一个由空接口组成的数组类型

type Person struct {
	name string
	age  int
}

func (p Person) String() string {
	return "< " + p.name + "-" + strconv.Itoa(p.age) + "years old />"
}
func main() {
	list := make(List, 3)
	list[0] = 1
	list[1] = "shakalaka"
	list[2] = Person{"Gao", 25}

	for index, element := range list {
		if value, ok := element.(int); ok {
			fmt.Printf("list[%d] is int and value is %d \n", index, value)
		} else if value, ok := element.(string); ok {
			fmt.Printf("list[%d] is string and value is %s \n", index, value)
		} else if value, ok := element.(Person); ok {
			fmt.Printf("list[%d] is Person and value is %s \n", index, value)
		} else {
			fmt.Printf("list[%d] is undefined", index)
		}
	}
}

这里就是调用 go 提供的内置函数, 在 php 当中就是 is_null,is_array这类的函数方法, 这种写法判定单个类型的时候比较方便,但是类型一多就会出现多个 if-else 这样很不优雅, 于是就有了下面的写法

switch

用代码看是最直观的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
	"fmt"
	"strconv"
)

type Element interface{} //定义一个空接口
type List []Element      //定义一个由空接口组成的数组类型

type Person struct {
	name string
	age  int
}

func (p Person) String() string {
	return "< " + p.name + "-" + strconv.Itoa(p.age) + "years old />"
}

func main() {
	list := make(List, 3)
	list[0] = 1
	list[1] = "shakalaka"
	list[2] = Person{"Gao", 25}

	for index, element := range list {
		switch value := element.(type) {
		case int:
			fmt.Printf("list[%d] is int and value is %d \n", index, value)
		case string:
			fmt.Printf("list[%d] is string and value is %s \n", index, value)
		case Person:
			fmt.Printf("list[%d] is Person and value is %s \n", index, value)
		default:
			fmt.Printf("list[%d] is undefined", index)
		}
	}
}

这样就能批量判定类型了 这里需要注意一下, element.(type) 这种写法只能出现在 switch 当中,判定单个类型的时候 还是老实的用 value , ok := element.(type) 这种写法 看到这里我们发现其实调用的都是同一个内置函数,就是添加了一个 switch 这样的使用情景