Fork me on GitHub

Golang之旅38-类型断言

类型断言

如何将一个接口变量,赋值给一个自定义类型的变量?

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
package main
import "fmt"

type Point struct {
x int
y int
}

func main(){
// 案例1
var a interface{} // a 是空接口变量
var point Point = Point{1, 2}
a = point // ok
var b Point
b = a.(Point) // 类型断言:判断 a 是否是指向Point类型的变量;如果是,则转成Point类型并赋给 b 变量,否则报错
fmt.Println(b)

// 案例2
var x interface{}
var c float32 = 1.1
x = c // 空接口可以接收任意类型
//y = x.(float64) 运行出现panic,不匹配
y = x.(float32) // 使用类型断言;类型要匹配

// 带检测的类型断言
if y, ok := x.(float32); ok == true{
fmt.Println("convert succeed")
fmt.Println(y)
}else {
fmt.Println("convert fail")
}

fmt.Println("继续执行")
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main
import "fmt"

// 定义接口
// 在接口中定义方法
type Usber interface{
Start()
Stop()
}

// 定义两个结构体
type Phone struct{}

type Camera struct{}

// 给 phone 实现接口中全部的方法
func (p Phone) Start(){
fmt.Println("手机开始工作")
}
func (p Phone) Stop(){
fmt.Println("手机停止工作")
}

// 给 camera 实现接口中全部的方法
func (c Camera) Start(){
fmt.Println("相机开始工作")
}
func (c Camera) Stop(){
fmt.Println("相机停止工作")
}

type Computer struct{}

func (c Computer) Working(usb Usber){
// 通过接口变量 usb 来调用接口 Usber 中的方法
usb.Start()
// 需求:当是手机Phone的时候,增加 call() 的方法
// 不能直接使用usb.call():否则camera中也会拥有call的方法
if phone,ok := usb.(Phone);ok{ // 类型断言
phone.Call()
}
usb.Stop()
}

func main(){
// 创建结构体变量
var usbArr [3]Usb
usbArr[0] = Phone{"vivo"}
usbArr[1] = Phone{"小米"}
usbArr[2] = Phone{"尼康"}

for _,v := range usbArr{
computer.Working(v)
fmt.Println()
}
}
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"

type Student struct{
}

// 编写函数,判断输入的参数是什么类型
func TypeJudge(items... interface{}){ // 可变参数...
for index, x := range items{
switch x.(type){
case bool:
fmt.Println(index, x)
case float32:
fmt.Println(index, x)
case int, int32, int64:
fmt.Println(index, x)
case Student:
fmt.Println(index, x)
case *Student:
fmt.Println(index, x)
default:
fmt.Println("类型不确定")
}
}
}

func main(){
var n1 float32 = 1.1
var n2 float64 = 2.3
var name string = "xiaoming"
address := "北京"
n4 := 300

stu1 := Student{}
stu2 := &Student{}

TypeJudge(n1, n2, name, address, n4, stu1, stu2)
}

本文标题:Golang之旅38-类型断言

发布时间:2019年11月17日 - 15:11

原始链接:http://www.renpeter.cn/2019/11/17/Golang%E4%B9%8B%E6%97%8538-%E7%B1%BB%E5%9E%8B%E6%96%AD%E8%A8%80.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea