go语言学习日记10.20
前言
得知了一个很可怕得消息,距离2021年12月18号的四级,还有59天。得开始看英语了。
iota
iota 是 Go 中预声明的一个特殊常量。 它会被预声明为0,但是它的值在编译阶段并非是固定的,当预声明的 iota 出现在一个常量声明中,它的值在第n个常量描述中的值为n (从0开始)。也就是说在你使用了关键字const后iota就会被初始话为0,此后每增加一行常量声明 iota+1。有点类似与长度可变的数组,你每添加一个元素数组下标+1。
1.iota的基本使用
就先来简单的看看iota吧。
package main
import "fmt"
const (
n1 = iota
n2 = iota
n3 = iota
)
func main() {
fmt.Println("n1=",n1)
fmt.Println("n2=",n2)
fmt.Println("n3=",n3)
}
n1=1
n2=2
n3=3
2. _ 跳过
在go语言中 _表示省略 那么在声明常量的时候使用这个符合 对iota有啥子印象嘞。
package main
import "fmt"
const (
n1 = iota
_
n2 = iota
n3 = iota
)
func main() {
fmt.Println("n1=",n1)
fmt.Println("n2=",n2)
fmt.Println("n3=",n3)
}
n1= 0 n2= 2 n3= 3
可以看到 iota等于1的情况被省略了 。也就是说 对于 _的使用,iota依旧会加一 仍然把它作为一个常量声明
3.iota中间插队
如果我们不是一直赋值iota,而是中间插入了常量的其它赋值 。
package main
import "fmt"
const (
n1 = iota
n = 100
n2 = iota
n3 = iota
)
func main() {
fmt.Println("n1=",n1)
fmt.Println("n2=",n2)
fmt.Println("n3=",n3)
fmt.Println("n=",n)
}
n1= 0 n= 100 n2= 2 n3= 3
可以看到iota依旧没什么影响,挺稳定的,该怎么来还是怎么来。
4.iota的案例使用
我们可以用iota,每声明一行常量 自增1这个特性来干一些事情。
package main
import "fmt"
const (
_ = iota
KB = 1 << (10*iota)
MB = 1 << (10*iota)
GB = 1 << (10*iota)
TB = 1 << (10*iota)
PB = 1 << (10*iota)
)
func main() {
fmt.Println("KB=",KB)
fmt.Println("MB=",MB)
fmt.Println("GB=",GB)
fmt.Println("TB",TB)
fmt.Println("PB=",PB)
}
KB= 1024 MB= 1048576 GB= 1073741824 TB 1099511627776 PB= 1125899906842624
诶对了,iota是每新增一行常量自增1 ,而不是新增每一个常量新增1。这里我们也可以来验证一下
package main
import "fmt"
const (
d1, d2 = iota + 1, iota + 2 // 这是第一行 iota为0 d1 = 1 d2 =2
d3, d4 = iota + 3, iota + 4 // 这是第二行 iota为1 d3 = 4 d = 5
)
func main() {
fmt.Println("d1=", d1)
fmt.Println("d2=", d2)
fmt.Println("d3=", d3)
fmt.Println("d4=", d4)
}
d1= 1 d2= 2 d3= 4 d4= 5
每新增一行 一行 一行 一行 一行 一行 一行 一行 一行 iota自增1
数据类型
1.整型
实话实说,go里面整型都分的比较细,我来列一下 int8 int16 int32 int64 加上无符号整型
uint8 uint16 uint32 uint64 。
| uint8 | 无符号 8位整型 (0 到 255) |
|---|---|
| uint16 | 无符号 16位整型 (0 到 65535) |
| uint32 | 无符号 32位整型 (0 到 4294967295) |
| uint64 | 无符号 64位整型 (0 到 18446744073709551615) |
| int8 | 有符号 8位整型 (-128 到 127) |
| int16 | 有符号 16位整型 (-32768 到 32767) |
| int32 | 有符号 32位整型 (-2147483648 到 2147483647) |
| int64 | 有符号 64位整型 (-9223372036854775808 到 9223372036854775807) |
符号位啥的我就不细说了。
注意:如果我们不限定位 而是直接使用 int uint位数则是按操作系统来的
| uint | 32位操作系统上就是uint32,64位操作系统上就是uint64 |
|---|---|
| int | 32位操作系统上就是int32,64位操作系统上就是int64 |
| uintptr | 无符号整型,用于存放一个指针 |
2.浮点型
浮点型 go就没int那么多了。就两 float32 float64 。
package main
import "fmt"
func main() {
// math.MaxFloat32
f1 := 1.234342
fmt.Printf("f1=%f %T\n",f1,f1) // go语言中的小数默认都是float64类型
f2 := float32(1.23432)
fmt.Printf("f2=%f %T\n",f2,f2) // 显示声明float32类型
// f1 = f2 // float32类型的值不能直接给float54类型的变量赋值
}
f1=1.234342 float64 f2=1.234320 float32
看一波源码。
这里面包含了各种数据类型的最大值。
3.布尔类型
package main
import "fmt"
func main() {
b1 := false
var b2 bool
fmt.Printf("%T\n",b1)
fmt.Printf("%v %T",b2,b2)
bool类型的默认值是false,而且不能充当数字0 1 进行运算。在有些语言里面是阔以滴。