一、switch结构介绍
* switch也属于条件判断的语句
* 支持多种写法,和if .. else if ...else 结构的功能类似,但是里面的细节需要注意的地方更多
* switch基本语法
switch [定义变量;] [变量]{
case [条件/具体值]:
//代码
case [条件/具体值]:
//代码
default:
//代码
}
* switch每个case分支默认只执行一个且是从上向下执行
* default上下位置没有影响,当且仅当所有case都不成立时才执行default
* 当变量只有固定的几个值时可以使用switch结构
func main() {
num := 16
switch num {
case 2:
fmt.Println("2进制")
case 8:
fmt.Println("8进制")
case 10:
fmt.Println("10进制")
case 16:
fmt.Println("16进制")
default:
fmt.Println("内容不正确")
}
fmt.Println("程序结束")
}
* switch也支持在条件位置定义变量,变量有效范围为当前switch
func main() {
switch num := 16; num {
case 2:
fmt.Println("2进制")
case 8:
fmt.Println("8进制")
case 10:
fmt.Println("10进制")
case 16:
fmt.Println("16进制")
default:
fmt.Println("内容不正确")
}
fmt.Println("程序结束")
}
* 当条件是范围而不是固定值时
func main() {
score := 71
switch {
case score >= 90:
fmt.Println("优秀")
case score >= 80:
fmt.Println("良好")
case score >= 70:
fmt.Println("中等")
case score >= 60:
fmt.Println("及格")
default:
fmt.Println("不及格")
}
fmt.Println("程序结束")
}
* case条件支持多个值,每个值使用逗号分开
func main() {
month := 5
switch month {
case 1, 3, 5, 7, 8, 10, 12:
fmt.Println("31天")
case 2:
fmt.Println("28或29天")
default:
fmt.Println("30天")
}
fmt.Println("程序结束")
}
* switch结构中最多只能执行一个case,使用fallthrough可以让下一个case/default继续执行
* break可以用在switch和循环中,表示立即结束,无论当前结构后面还有多少代码
二、时间类型概述
* 时间类型在实际开发中使用频率很高,代表现实世界的时间
* 在Go语言中时间类型不是关键字而是使用time包下的Time结构体
* 时间类型默认显示为UTC,所以经常需要把时间类型转换为字符串,显示成我们所熟悉的格式
* 声明Time时,默认时间是无意义的
func main() {
var t time.Time
fmt.Println(t)//输出:0001-01-01 00:00:00 +0000 UTC
}
* 可以通过time包下的Now()函数获取操作系统当前时间
t := time.Now()
* 也可以通过时间戳创建时间类型变量(距离1970年1月1日的纳秒差)
/*
1秒(s)=1000毫秒(ms)
1秒(s)=1000000微秒(μs)
1秒(s)=1000000000纳秒(ns)
*/
t := time.Now()
t1 := time.Unix(0, t.UnixNano()) //根据时间戳创建时间.第二个值[0, 999999999]外合法
fmt.Println(t.String())
fmt.Println(t1)
* 可以根据自己要求创建时间
* 在time包下提供了大量的函数或方法获取时间的某一项
t := time.Now()
fmt.Println(t)
fmt.Println(t.Year()) //年
fmt.Println(int(t.Month())) //月
fmt.Println(t.Day()) //日
fmt.Println(t.Date()) //三个参数,分别是:年,月,日
fmt.Println(t.Hour()) //小时
fmt.Println(t.Minute()) //分钟
fmt.Println(t.Second()) //秒
fmt.Println(t.Clock()) //三个参数,分别是:小时,分钟,秒
fmt.Println(t.Nanosecond()) //纳秒
fmt.Println(t.Unix()) //秒差
fmt.Println(t.UnixNano()) //纳秒差
* Time转换为string
t := time.Now()
//参数必须是这个时间,格式任意
s := t.Format("2006-01-02 15:04:05", )
fmt.Println(s)
* string转换为Time
s:="2022-02-04 22:02:04"
t,err:=time.Parse("2006-01-02 15:04:05",s)
fmt.Println(t,err)
三、常用数学函数
* math包提供了基本数学常数和数学函数
* math包提供的数学常数
* 列举出常用的数学函数
var i, j float64 = 12.3, 9.6
//向下取整,
fmt.Println(math.Floor(i)) //输出:12
//向上取整
fmt.Println(math.Ceil(i)) //输出:13
//绝对值
fmt.Println(math.Abs(i)) //输出:12.3
//返回值分别整数位和小数位,小数位可能出现误差
num, decimal := math.Modf(i)
fmt.Println(num, decimal)
//返回两个变量中大的值
fmt.Println(math.Max(i, j)) //输出:12.3
//返回两个变量中小的值
fmt.Println(math.Min(i, j)) //输出:9.6
//x的y次方
fmt.Println(math.Pow(3, 2)) //输出:输出9
//四舍五入
fmt.Println(math.Round(i)) //输出:12
四、随机数
* math/rand实现了伪随机数生成器
* 在Go语言中随机数需要设置种子,如果不设置种子随机数的结果每次运行都相同。
* 默认种子是1,且相同种子产生的随机数是相同的.
* 可以使用当前时间的纳秒差计算随机数,在一定程度上保证了种子的唯一性
rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Int63n(10))