三分钟学 Go 语言——条件语句+switch和type switch

简介: 三分钟学 Go 语言——条件语句+switch和type switch

aHR0cHM6Ly9pbWdrci5jbi1iai51ZmlsZW9zLmNvbS8xNmEzMzQzMS0yN2U2LTQwMjctOTQ2NC0zY2Y3N2MzNjA0OTMucG5n.png


ifelse


aHR0cHM6Ly9pbWdrci5jbi1iai51ZmlsZW9zLmNvbS80ZWZiZjAxZC0yZTdmLTQ3NTMtYTQxZC04ODRhZjg5ODkwYjcucG5n.png

if 20>0{
    fmt.Println("yes")
  }

输出


yes


ifelse



aHR0cHM6Ly9pbWdrci5jbi1iai51ZmlsZW9zLmNvbS8yYjM0NWRjYi02YmI5LTQxZmUtYmM1Yy1hOTlmZjkzMWRjODkucG5n.png



if 20<0{
  }else{
    fmt.Println("no")
  }

输出

no



aHR0cHM6Ly9pbWdrci5jbi1iai51ZmlsZW9zLmNvbS9mZDgwOTJkMi1hM2YyLTQ2M2UtYWU0NC0wM2MwMWVkMWIwMjIucG5n.png


switch 好理解,是一个替代if else else else接口而提出的,如下,switch 后跟变量,case 后跟常量,只要变量值和常量匹配,就执行该分支下的语句。

switch name {
  case "coding3min":
    fmt.Println("welcome" + name)
  default:
    fmt.Println("403 forbidden:" + name)
    return
  }

当然switch语句会逐个匹配case语句,一个一个的判断过去,直到有符合的语句存在。

switch {
  case number >= 90:
    fmt.Println("优秀")
  case number >= 80:
    fmt.Println("良好")
  case number >= 60:
    fmt.Println("凑合")
  default:
    fmt.Println("太搓了")
  }


如果没有一个是匹配的,就执行default后的语句。

注意switch后可以跟空,如上


switch {


这样case就必须是表达式。


switch 的高级玩法?


有一个流传于坊间的神秘玩法,可以用switch语句来判断传入变量的类型,然后做一些羞羞的事情。x是一个未知类型的变量,switch t := x.(type) 用这个方式来赋值,t就是有确定类型的变量。

switch t := x.(type) {
  case int:
    return t
  case float64:
    return int(math.Ceil(t))
  }


什么叫未知类型??

这就是 go 中有意思的地方了, interface{} 类型,是一种神奇的类型,他可以是任何类型的接口,而具体的类型是实现。


var x interface{}
  x = 1
  fmt.Println(x)



输出1

所以完整的函数是这样的

func typeSwitchDemo(x interface{}) int {
  switch t := x.(type) {
  case int:
    return t
  case float64:
    return int(math.Ceil(t))
  }
  return 0
}

这个东西有什么用呢??有没有想过如果你有一个场景,你在调用第三方的接口,却发现对方的接口发生了微调,原来的int类型,被转换成了string类型,你必须写出兼容两种方式的代码来解析json。


那么这个时候,type switch 将会是你的武器。


感兴趣可以 跑到这里看看,我是怎么使用这个武器的。


https://github.com/pzqu/how_to_code/blob/master/golang/medium/json_interface/fixed_json.go

相关文章
|
2天前
|
SQL 安全 Go
【Go语言专栏】Go语言中的安全审计与漏洞修复
【4月更文挑战第30天】本文介绍了Go语言中的安全审计和漏洞修复实践。安全审计包括代码审查、静态分析、运行时分析、渗透测试和专业服务,借助工具如`go vet`、`staticcheck`、`gosec`等。修复漏洞的方法涉及防止SQL注入、XSS攻击、CSRF、不安全反序列化等。遵循最小权限原则、输入验证等最佳实践,结合持续学习,可提升Go应用安全性。参考[Go安全工作组](https://github.com/golang/security)和[OWASP Top 10](https://owasp.org/www-project-top-ten/)深入学习。
|
1天前
|
安全 Go 开发者
Golang深入浅出之-Go语言中的CSP模型:深入理解并发哲学
【5月更文挑战第1天】Go语言基于CSP理论,借助goroutines和channels实现独特的并发模型。Goroutine是轻量级线程,通过`go`关键字启动,而channels提供安全的通信机制。文章讨论了数据竞争、死锁和goroutine泄漏等问题及其避免方法,并提供了一个生产者消费者模型的代码示例。理解CSP和妥善处理并发问题对于编写高效、可靠的Go程序至关重要。
7 2
|
1天前
|
设计模式 Go 调度
Golang深入浅出之-Go语言中的并发模式:Pipeline、Worker Pool等
【5月更文挑战第1天】Go语言并发模拟能力强大,Pipeline和Worker Pool是常用设计模式。Pipeline通过多阶段处理实现高效并行,常见问题包括数据竞争和死锁,可借助通道和`select`避免。Worker Pool控制并发数,防止资源消耗,需注意任务分配不均和goroutine泄露,使用缓冲通道和`sync.WaitGroup`解决。理解和实践这些模式是提升Go并发性能的关键。
12 2
|
1天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
11 2
|
1天前
|
Go
Golang深入浅出之-Go语言代码质量与规范:遵循Gofmt与Linting
【5月更文挑战第1天】本文讨论了如何使用`gofmt`和Lint工具提升Go代码质量。`gofmt`负责自动格式化代码,保持风格统一,而Lint工具如`golint`、`govet`、`staticcheck`则进行静态分析,检查潜在错误和未使用的变量。通过集成`gofmt`检查到CI/CD流程,避免格式冲突,并使用Lint工具发现并修复问题,如未处理的错误、不规范命名。遵循这些最佳实践,可提高代码可读性、团队协作效率和可维护性。
9 3
|
2天前
|
JSON 安全 Java
2024年的选择:为什么Go可能是理想的后端语言
【4月更文挑战第27天】Go语言在2024年成为后端开发的热门选择,其简洁设计、内置并发原语和强大工具链备受青睐。文章探讨了Go的设计哲学,如静态类型、垃圾回收和CSP并发模型,并介绍了使用Gin和Echo框架构建Web服务。Go的并发通过goroutines和channels实现,静态类型确保代码稳定性和安全性,快速编译速度利于迭代。Go广泛应用在云计算、微服务等领域,拥有丰富的生态系统和活跃社区,适合作为应对未来技术趋势的语言。
8 0
|
2天前
|
Go 开发者
Golang深入浅出之-Go语言项目构建工具:Makefile与go build
【4月更文挑战第27天】本文探讨了Go语言项目的构建方法,包括`go build`基本命令行工具和更灵活的`Makefile`自动化脚本。`go build`适合简单项目,能直接编译Go源码,但依赖管理可能混乱。通过设置`GOOS`和`GOARCH`可进行跨平台编译。`Makefile`适用于复杂构建流程,能定义多步骤任务,但编写较复杂。在选择构建方式时,应根据项目需求权衡,从`go build`起步,逐渐过渡到Makefile以实现更高效自动化。
12 2
|
2天前
|
存储 Go
Golang深入浅出之-Go语言依赖管理:GOPATH与Go Modules
【4月更文挑战第27天】Go语言依赖管理从`GOPATH`进化到Go Modules。`GOPATH`时代,项目结构混乱,可通过设置多个工作空间管理。Go Modules自Go 1.11起提供更现代的管理方式,通过`go.mod`文件控制依赖。常见问题包括忘记更新`go.mod`、处理本地依赖和模块私有化,可使用`go mod tidy`、`replace`语句和`go mod vendor`解决。理解并掌握Go Modules对现代Go开发至关重要。
11 2
|
2天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
8 1
|
2天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1