Golang switch 进阶


一. case 表达式中的子表达式应该不重复

bad(编译不通过) :
第九行和第十一行的 3 重复了

package main

import "fmt"

var a = []uint{1, 2, 3, 4, 5, 6}

func main() {
	switch 1 {
	case 1, 2, 3:
		fmt.Println("1 or 2 or 3")
	case 3, 4:
		fmt.Println("3 or 4")
	}
}

good :

package main

import "fmt"

var a = []uint{1, 2, 3, 4, 5, 6}

func main() {
	switch 1 {
	case 1, 2, 3:
		fmt.Println("1 or 2 or 3")
	case 4:
		fmt.Println("4")
	}
}

二. 使用表达值突破 一 的限制

三个case中都包含2,但是由于前两个case是表达式a[1], 这个是可以正常运行的

package main

import "fmt"

var a = []uint{1, 2, 3, 4, 5, 6}

func main() {
	switch uint(4) {
	case 1, a[1], 3:
		fmt.Println("1 or 2 or 3")
	case a[1], 4:
		fmt.Println("2 or 4")
	case 2:
		fmt.Println("2")
	}
}

三. case 类型匹配

switch p1.(type)

  1. 这里要求 p1 实现了某个 接口
  2. case中的表达式是这个 接口的具体实现类型

example 1 (good) :

package main

import "fmt"

var b uint8
var c byte

type MyInt interface {
	pr()
}

type MI int
type BMI int

func (M MI) pr() {
	fmt.Println(M)
}

func (M BMI) pr() {
	fmt.Println(M)
}

func main() {
	var d MyInt
	d = MI(b)
	switch d.(type) {
	case MI:
		fmt.Println("BMI")
	case BMI:
		fmt.Println("BMI")
	}
}

example 2(good):

package main

import "fmt"

var a string
var b uint8

func main() {
	d := interface{}(b)
	switch d.(type) {
	case string:
		fmt.Println("string")
	case uint8:
		fmt.Println("unit8")
	}
}

example 3(bad):
违反了 一,因为 byte 本质就是 unit8 , 编译不通过

package main

import "fmt"

var a string
var b uint8

func main() {
	d := interface{}(b)
	switch d.(type) {
	case string:
		fmt.Println("string")
	case uint8:
		fmt.Println("unit8")
	case byte:
		fmt.Println("byte")
	}
}

example 4(bad) :
b非接口类型,编译不通过

package main

import "fmt"

var a string
var b uint8

func main() {
    switch b.(type) {
       case string:
       fmt.Println("string")
       case uint8:
       fmt.Println("unit8")
   }
}

四. switch 中的自动类型转换
switch <value> :
case <case-value>

如果case-value 是常量,会尝试进行自动类型转换后,再和 value 匹配
right :

package main

import "fmt"

func main() {
	switch 1 + 1 {
	case 2:
		fmt.Println(2)
	}
}

error : main.go:8:7: invalid case b in switch on 1 + 1 (mismatched types int64 and int)

package main

import "fmt"

func main() {
	b := int64(2)
	switch 1 + 1 {
	case b: 
		fmt.Println(2)
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴回答你关于Golang语法进阶的问题!Golang是一门简洁高效的编程语言,下面我将分享一些Golang语法的进阶知识。 1. 嵌套结构体:在Golang中,你可以在一个结构体中嵌套另一个结构体。这样可以更好地组织和管理代码。例如: ```go type Person struct { Name string Age int } type Employee struct { Person Salary int } ``` 这里的Employee结构体嵌套了Person结构体,可以通过Employee结构体访问Person结构体的字段。 2. 接口和类型断言:Golang中的接口是一种约定,定义了一组方法。通过接口,你可以实现多态性。类型断言则用于检查接口变量是否实现了某个接口。例如: ```go type Shape interface { Area() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius } func main() { var shape Shape = Circle{Radius: 5} if circle, ok := shape.(Circle); ok { fmt.Println("Area of circle:", circle.Area()) } } ``` 3. 并发编程:Golang内置了并发编程的支持,通过goroutine和通道(channel)可以实现轻量级线程间通信。例如: ```go func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("Worker", id, "processing job", j) time.Sleep(time.Second) // 模拟耗时操作 results <- j * 2 } } func main() { jobs := make(chan int, 5) results := make(chan int, 5) // 启动三个goroutine for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送5个任务 for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 输出结果 for r := 1; r <= 5; r++ { fmt.Println(<-results) } } ``` 以上是Golang语法进阶的一些例子,希望对你有帮助!如果你有更多问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值