仓库地址 https://gitee.com/shinxb_1697178173/go_study 本仓库是在学习过程中创建
数据类型
import ("fmt""testing""unsafe")/*数据类型*/func TestInt(t *testing.T) {fmt.Println("无符号数据了类型---")var uintData uint // uint 在32位操作系统中表示 0 -- 2^32 -1 在64位操作系统中 0 - 2^64 -1var uintData8 uint8 // 无符号 8 位整型 (0 到 255) 2^8 - 1var uintData16 uint16 // 无符号 16 位整型 (0 到 255) 2^16 - 1var uintData32 uint32 // 无符号 32 位整型 (0 到 255) 2^32 - 1var uintData64 uint64 // 无符号 64 位整型 (0 到 255) 2^64 - 1var uintDataptr uintptr // 存放指针fmt.Println(unsafe.Sizeof(uintData))fmt.Println(unsafe.Sizeof(uintData8))fmt.Println(unsafe.Sizeof(uintData16))fmt.Println(unsafe.Sizeof(uintData32))fmt.Println(unsafe.Sizeof(uintData64))fmt.Println(unsafe.Sizeof(uintDataptr))fmt.Println("有符号数据了类型---")var intData int // 更具具体操作系统决定大小var intData8 int8 // 有符号 -(2^7) 2^7-1var intData16 int16 // 有符号 -(2^15) 2^15-1var intData32 int32 // 有符号 -(2^31) 2^31-1var intData64 int64 // 有符号 -(2^63) 2^63-1fmt.Println(unsafe.Sizeof(intData))fmt.Println(unsafe.Sizeof(intData8))fmt.Println(unsafe.Sizeof(intData16))fmt.Println(unsafe.Sizeof(intData32))fmt.Println(unsafe.Sizeof(intData64))}func TestFloat(t *testing.T) {// 浮点数都是有符号的/*存储方式 三部分存储 符号位 指数位 尾数部分*/fmt.Println("浮点数---")var price1 float32 = -123.43434343 // 尾数部分会丢失var price2 float64 = -123.43434343 // 精度高fmt.Println("price1=",price1,"price2=",price2)// 输出结果 price1= -123.43434 price2= -123.43434343fmt.Println(unsafe.Sizeof(price1))fmt.Println(unsafe.Sizeof(price2))}func TestString(t *testing.T) {fmt.Println("字符串 byte类型")// byte 类型和uin8一样 表示一个字节/*1 传统的字符串是由字符组成的 ,但是在Go中用字节来保存字符,所以在Go语言中字符串是单个字节连接起来的2 Go中的字符使用UTF-8编码3 英文字母一个字节 汉子三个字节4 在GO中字符的本质是一个整数,直接输出的是该字符的编码值5 字符类型是可以直接进行运算的字符类型的本质 存储和读取的流程[存储 字符->码值->二进制->存储读取 二进制->码值->字符->读取]*/var bytesString1 bytefmt.Println(unsafe.Sizeof(bytesString1)) // 输出 1bytesString1 = 255// 字符本质表示的是数字 编码值bytesString2 := '国' // int32fmt.Println(bytesString2) // 输出 22269}
channel
发生阻塞的情况 ```go func TestGOChannelDemo1(t testing.T) { // channel 用于协程之间的通信 /
- 从一个被close的channel中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)
从一个返回nil的channel中接收数据会发生阻塞 */ // 1 不会发生阻塞 //var channelVal1 = make(chan int,10) //close(channelVal1) //i,ok :=<-channelVal1 //fmt.Println(i,ok)
// 2 会发生阻塞 var channelVal2 = make(chan int,10) // channel中存在值则不会发生阻塞 channelVal2<-2 i,ok :=<-channelVal2 fmt.Println(i,ok)
}
- Range遍历channel使用range 遍历时 channle必须是在关闭状态下,否则程序一致block```gofunc TestGOChannelDemo3(t *testing.T) {go func() {time.Sleep(1 * time.Hour)}()c := make(chan int)go func() {for i := 0; i < 10; i = i + 1 {c <- i}close(c)}()//range c产生的迭代值为Channel中发送的值,它会一直迭代直到channel被关闭 如果去除掉close 程序一致block//for i := range c {// fmt.Println(i)//}//使用for 循环不会blockfor i:=0;i<10;i++{j:=<-cfmt.Println(j)}fmt.Println("Finished")}
