仓库地址 https://gitee.com/shinxb_1697178173/go_study 本仓库是在学习过程中创建
image.png

数据类型

  1. import (
  2. "fmt"
  3. "testing"
  4. "unsafe"
  5. )
  6. /*
  7. 数据类型
  8. */
  9. func TestInt(t *testing.T) {
  10. fmt.Println("无符号数据了类型---")
  11. var uintData uint // uint 在32位操作系统中表示 0 -- 2^32 -1 在64位操作系统中 0 - 2^64 -1
  12. var uintData8 uint8 // 无符号 8 位整型 (0 到 255) 2^8 - 1
  13. var uintData16 uint16 // 无符号 16 位整型 (0 到 255) 2^16 - 1
  14. var uintData32 uint32 // 无符号 32 位整型 (0 到 255) 2^32 - 1
  15. var uintData64 uint64 // 无符号 64 位整型 (0 到 255) 2^64 - 1
  16. var uintDataptr uintptr // 存放指针
  17. fmt.Println(unsafe.Sizeof(uintData))
  18. fmt.Println(unsafe.Sizeof(uintData8))
  19. fmt.Println(unsafe.Sizeof(uintData16))
  20. fmt.Println(unsafe.Sizeof(uintData32))
  21. fmt.Println(unsafe.Sizeof(uintData64))
  22. fmt.Println(unsafe.Sizeof(uintDataptr))
  23. fmt.Println("有符号数据了类型---")
  24. var intData int // 更具具体操作系统决定大小
  25. var intData8 int8 // 有符号 -(2^7) 2^7-1
  26. var intData16 int16 // 有符号 -(2^15) 2^15-1
  27. var intData32 int32 // 有符号 -(2^31) 2^31-1
  28. var intData64 int64 // 有符号 -(2^63) 2^63-1
  29. fmt.Println(unsafe.Sizeof(intData))
  30. fmt.Println(unsafe.Sizeof(intData8))
  31. fmt.Println(unsafe.Sizeof(intData16))
  32. fmt.Println(unsafe.Sizeof(intData32))
  33. fmt.Println(unsafe.Sizeof(intData64))
  34. }
  35. func TestFloat(t *testing.T) {
  36. // 浮点数都是有符号的
  37. /*
  38. 存储方式 三部分存储 符号位 指数位 尾数部分
  39. */
  40. fmt.Println("浮点数---")
  41. var price1 float32 = -123.43434343 // 尾数部分会丢失
  42. var price2 float64 = -123.43434343 // 精度高
  43. fmt.Println("price1=",price1,"price2=",price2)
  44. // 输出结果 price1= -123.43434 price2= -123.43434343
  45. fmt.Println(unsafe.Sizeof(price1))
  46. fmt.Println(unsafe.Sizeof(price2))
  47. }
  48. func TestString(t *testing.T) {
  49. fmt.Println("字符串 byte类型")
  50. // byte 类型和uin8一样 表示一个字节
  51. /*
  52. 1 传统的字符串是由字符组成的 ,但是在Go中用字节来保存字符,所以在Go语言中字符串是单个字节连接起来的
  53. 2 Go中的字符使用UTF-8编码
  54. 3 英文字母一个字节 汉子三个字节
  55. 4 在GO中字符的本质是一个整数,直接输出的是该字符的编码值
  56. 5 字符类型是可以直接进行运算的
  57. 字符类型的本质 存储和读取的流程
  58. [
  59. 存储 字符->码值->二进制->存储
  60. 读取 二进制->码值->字符->读取
  61. ]
  62. */
  63. var bytesString1 byte
  64. fmt.Println(unsafe.Sizeof(bytesString1)) // 输出 1
  65. bytesString1 = 255
  66. // 字符本质表示的是数字 编码值
  67. bytesString2 := '国' // int32
  68. fmt.Println(bytesString2) // 输出 22269
  69. }

channel

  • 发生阻塞的情况 ```go func TestGOChannelDemo1(t testing.T) { // channel 用于协程之间的通信 /

    1. 从一个被close的channel中接收数据不会被阻塞,而是立即返回,接收完已发送的数据后会返回元素类型的零值(zero value)
    2. 从一个返回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)

}

  1. - Range遍历channel
  2. 使用range 遍历时 channle必须是在关闭状态下,否则程序一致block
  3. ```go
  4. func TestGOChannelDemo3(t *testing.T) {
  5. go func() {
  6. time.Sleep(1 * time.Hour)
  7. }()
  8. c := make(chan int)
  9. go func() {
  10. for i := 0; i < 10; i = i + 1 {
  11. c <- i
  12. }
  13. close(c)
  14. }()
  15. //range c产生的迭代值为Channel中发送的值,它会一直迭代直到channel被关闭 如果去除掉close 程序一致block
  16. //for i := range c {
  17. // fmt.Println(i)
  18. //}
  19. //使用for 循环不会block
  20. for i:=0;i<10;i++{
  21. j:=<-c
  22. fmt.Println(j)
  23. }
  24. fmt.Println("Finished")
  25. }