Switch用于类型判断

在本小节中,将在Go代码switch.go中讲解如何使用switch语句来区分不同的数据类型,这将分为四个部分进行介绍。switch.go的Go代码部分基于useInterface.go,但它将添加另一个名为rectangle的类型,不需要实现任何接口的方法。

  1. >```go
  2. > package main
  3. >
  4. > import (
  5. > "fmt"
  6. > )
  7. >

由于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. >

这三种类型都很简单。

  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. >

在这里,实现了一个名为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. >

执行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!