> go语言github项目:https://github.com/minibear2333/how_to_code
![](https://coding3min.oss-accelerate.aliyuncs.com/coding3min/2020-04-14-125225.jpg)
[TOC]
### ifelse
![](https://coding3min.oss-accelerate.aliyuncs.com/coding3min/2020-04-14-125215.jpg)
```go
if 20>0{
fmt.Println("yes")
}
```
输出
```go
yes
```
ifelse
![](https://coding3min.oss-accelerate.aliyuncs.com/coding3min/2020-04-14-125252.jpg)
```go
if 20<0{
}else{
fmt.Println("no")
}
```
输出
```go
no
```
### switch 和 type switch
![](https://coding3min.oss-accelerate.aliyuncs.com/coding3min/2020-04-14-125322.jpg)
`switch` 好理解,是一个替代`if else else else`接口而提出的,如下,`switch` 后跟变量,`case` 后跟常量,只要变量值和常量匹配,就执行该分支下的语句。
```go
switch name {
case "coding3min":
fmt.Println("welcome" + name)
default:
fmt.Println("403 forbidden:" + name)
return
}
```
当然`switch`语句会逐个匹配`case`语句,一个一个的判断过去,直到有符合的语句存在。
```go
switch {
case number >= 90:
fmt.Println("优秀")
case number >= 80:
fmt.Println("良好")
case number >= 60:
fmt.Println("凑合")
default:
fmt.Println("太搓了")
}
```
如果没有一个是匹配的,就执行`default`后的语句。
注意`switch`后可以跟空,如上
```go
switch {
```
这样`case`就必须是表达式。
### switch 的高级玩法?
有一个流传于坊间的神秘玩法,可以用`switch`语句来判断传入变量的类型,然后做一些羞羞的事情。`x`是一个未知类型的变量,`switch t := x.(type)` 用这个方式来赋值,`t`就是有确定类型的变量。
```go
switch t := x.(type) {
case int:
return t
case float64:
return int(math.Ceil(t))
}
```
什么叫未知类型??
这就是 `go` 中有意思的地方了, `interface{}` 类型,是一种神奇的类型,他可以是任何类型的接口,而具体的类型是实现。
```go
var x interface{}
x = 1
fmt.Println(x)
```
输出`1`
所以完整的函数是这样的
```go
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/minibear2333/how_to_code/blob/master/golang/medium/json_interface/fixed_json.go
- 安装与下载
- 投稿大纲
- 第一章、跑起来
- 为什么要学 go 语言?
- 让你的 Golang 项目在 IDE 里跑起来
- 第一个 go 程序
- go mod最佳实践
- 第二章、语言基础
- 声明【变量】的各种方式
- 常量+各种类型转换
- switch和type switch
- 循环语句的多种形式、死循环、break/continue
- range深度解析
- 第三章、函数和容器
- 函数简单使用和基本知识解析
- 匿名函数和闭包
- 可变参数
- 集合(map)
- 数组和切片
- 切片知识补充
- 第四章、指针、结构体、接口和异常处理
- 指针讨论
- 结构体
- 接口与多态
- 异常处理
- 第五章、再学一点运用自如
- 其他常用操作
- Go文件操作大全
- Go代码基本标准规范
- 切片排序sort包的使用
- Golang打镜像Dockerfile的写法
- 等待goroutine完成任务,循环中使用goroutine
- kinping.flag包读取命令行配置