go语言学习日记10.20

136 阅读4分钟

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位数则是按操作系统来的

uint32位操作系统上就是uint32,64位操作系统上就是uint64
int32位操作系统上就是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

​ 看一波源码。

image-20211020225731227

​ 这里面包含了各种数据类型的最大值。

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 进行运算。在有些语言里面是阔以滴。