07.4.2 Switch用于类型判断
在本小节中,将在Go代码switch.go中讲解如何使用switch语句来区分不同的数据类型,这将分为四个部分进行介绍。switch.go的Go代码部分基于useInterface.go,但它将添加另一个名为rectangle的类型,不需要实现任何接口的方法。
1
>```go
2
> package main
3
>
4
> import (
5
> "fmt"
6
> )
7
>
Copied!
由于switch.go中的代码不需要实现myInterface.go中定义的接口,因此不需要导入myInterface包。
1
>```go
2
> type square struct {
3
> X float64
4
> }
5
>
6
> type circle struct {
7
> R float64
8
> }
9
>
10
> type rectangle struct {
11
> X float64
12
> Y float64
13
> }
14
>
Copied!
这三种类型都很简单。
1
>```go
2
> func tellInterface(x interface{}) {
3
> switch v := x.(type) {
4
> case square:
5
> fmt.Println("This is a square!")
6
> case circle:
7
> fmt.Printf("%v is a circle!\n", v)
8
> case rectangle:
9
> fmt.Println("This is a rectangle!")
10
> default:
11
> fmt.Printf("Unknown type %T!\n", v)
12
> }
13
> }
14
>
Copied!
在这里,实现了一个名为tellInterface()的函数,该函数有一个类型为interface的参数x
这个函数实现体现了区分不同数据类型的x参数。通过使用返回x元素类型的x.(type)语句来实现这样的效果。在fmt.Printf()函数中使用的格式化字符串%v来获取类型的值。
1
>```go
2
> func main() {
3
> x := circle{R: 10}
4
> tellInterface(x)
5
> y := rectangle{X: 4, Y: 1}
6
> tellInterface(y)
7
> z := square{X: 4}
8
> tellInterface(z)
9
> tellInterface(10)
10
> }
11
>
Copied!
执行switch.go将生成以下的输出:
1
$ go run switch.go
2
{10} is a circle!
3
This is a rectangle!
4
This is a square!
5
Unknown type int!
Copied!
Copy link