仓库地址 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 -1
var uintData8 uint8 // 无符号 8 位整型 (0 到 255) 2^8 - 1
var uintData16 uint16 // 无符号 16 位整型 (0 到 255) 2^16 - 1
var uintData32 uint32 // 无符号 32 位整型 (0 到 255) 2^32 - 1
var uintData64 uint64 // 无符号 64 位整型 (0 到 255) 2^64 - 1
var 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-1
var intData16 int16 // 有符号 -(2^15) 2^15-1
var intData32 int32 // 有符号 -(2^31) 2^31-1
var intData64 int64 // 有符号 -(2^63) 2^63-1
fmt.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.43434343
fmt.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 byte
fmt.Println(unsafe.Sizeof(bytesString1)) // 输出 1
bytesString1 = 255
// 字符本质表示的是数字 编码值
bytesString2 := '国' // int32
fmt.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
```go
func 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 循环不会block
for i:=0;i<10;i++{
j:=<-c
fmt.Println(j)
}
fmt.Println("Finished")
}