You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
4.1 KiB

  1. # 数据类型
  2. Go语言中常见的数据类型有很多,例如:
  3. - 整型,用于表示整数。
  4. - 浮点型,用于表示小数。
  5. - 布尔型,用于表示真/假。
  6. - 字符串,用于表示文本信息。
  7. - 数组,用于表示多个数据(数据集合)
  8. - 指针,用于表示内存地址的类型。
  9. - 切片,用于表示多个数据(数据集合)
  10. - 字典,用于表示键值对结合。
  11. - 结构体,用于自定义一些数据集合。
  12. - 接口,用于约束和泛指数据类型。
  13. ## 整型
  14. Go中的整型分为有符号和无符号两大类,有符号的包含负值,无符号不包含负值。
  15. 有符号整型:
  16. - int8(-128 -> 127)
  17. - int16(-32768 -> 32767)
  18. - int32(-2,147,483,648 -> 2,147,483,647)
  19. - int64(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807)
  20. - int
  21. - 在 32 位操作系统上使用 32 位(-2,147,483,648 -> 2,147,483,647) 2**32
  22. - 在 64 位操作系统上使用 64 位(-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,80)2**64
  23. 无符号整数:
  24. - uint8(0 -> 255)
  25. - uint16(0 -> 65,535)
  26. - uint32(0 -> 4,294,967,295)
  27. - uint64(0 -> 18,446,744,073,709,551,615)
  28. - uint
  29. - 在 32 位操作系统上使用32 位(0 -> 4,294,967,295) 2**32
  30. - 64 位操作系统上使用 64 位(0 -> 18,446,744,073,709,551,615) 2**64
  31. 不同整型可表示的数据范围不同,我们需要根据自己的需求来选择适合的类型。
  32. ### 整型转换
  33. ```go
  34. data := intxxx(其他整型)
  35. var v1 int8 = 10
  36. var v2 int16 = 18
  37. v3 := int16(v1) + v2
  38. fmt.Println(v3, reflect.TypeOf(v3))
  39. ```
  40. 注意:
  41. - 地位转向高位,没问题。
  42. - 高位转向低位,可能有问题
  43. 现象:轮回=>不会报错
  44. ```go
  45. var v1 int16 = 130
  46. v2 := int8(v1)
  47. fmt.Println(v2)
  48. 输出结果为 -126
  49. ```
  50. ### 其他进制转换
  51. ### math下的数学运算模块
  52. ### 指针/nil/声明变量/new
  53. - 声明变量
  54. - 指针
  55. - new 关键字
  56. - nil 空值
  57. 为什么要有指针?
  58. > 为了节省内存,不重复开辟空间区存储
  59. int和*int是两种不同的数据类型
  60. ### 超大整型
  61. 使用指针的方式,即:使用new来进行创建和初始化。
  62. ```go
  63. // 第一步:创建一个超大整型的一个对象
  64. var v1 big.Int
  65. var v2 big.Int
  66. // 第二步:在超大整型对象中写入值
  67. v1.SetInt64(9223372036854775807)
  68. fmt.Println(v1)
  69. v2.SetString("92233720368547758089223372036854775808", 10)
  70. fmt.Println(v2)
  71. ```
  72. ```go
  73. // 第一步:创建一个超大整型的一个对象
  74. v3 := new(big.Int)
  75. v4 := new(big.Int)
  76. // 第二步:在超大整型对象中写入值
  77. v3.SetInt64(9223372036854775807)
  78. fmt.Println(v3)
  79. v4.SetString("92233720368547758089223372036854775808", 10)
  80. fmt.Println(v4)
  81. ```
  82. #### 超大整形的运算
  83. 也是建议使用new的方式
  84. ## 浮点型
  85. float类型,计算机中小数的非精确的表示方式,如:`3.14`
  86. ### float底层存储原理
  87. 1. 浮点型转换为二进制
  88. 2. 科学计数法表示
  89. 3. 存储
  90. ### decimal
  91. 第三方的包
  92. ```go
  93. package main
  94. import (
  95. "fmt"
  96. "github.com/shopspring/decimal"
  97. )
  98. func main() {
  99. var v1 = decimal.NewFromFloat(0.0000000000019)
  100. var v2 = decimal.NewFromFloat(0.29)
  101. var v3 = v1.Add(v2)
  102. var v4 = v1.Sub(v2)
  103. var v5 = v1.Mul(v2)
  104. var v6 = v1.Div(v2)
  105. fmt.Println(v3, v4, v5, v6) // 输出:0.2900000000019(也可以调用String方法)
  106. var price = decimal.NewFromFloat(3.4626)
  107. var data1 = price.Round(1) // 保留小数点后1位(四舍五入)
  108. var data2 = price.Truncate(1) // 保留小数点后1位
  109. fmt.Println(data1, data2) // 输出:3.5 3.4
  110. }
  111. ```
  112. ## 布尔类型
  113. 阿巴阿巴
  114. ## 字符串
  115. 阿巴阿巴
  116. ### 底层存储逻辑
  117. 计算机中所有的操作和数据最终都是二进制,即:1000100001011...
  118. Go语言中的字符串是utf-8编码的序列。
  119. ## 数组
  120. 数组,定长且元素类型一致的数据集合。
  121. - 数组的内存是连续的。
  122. - 数组的内存地址实际上就是数组第一个元素的内存地址。
  123. - 每个字符串的内部存储:`len` + `str`
  124. ### 可变和拷贝
  125. 可变,数组的元素可以被更改(长度和类型都不可以修改)。
  126. 注意:字符串不可以被修改。
  127. 拷贝,变量赋值时重新拷贝一份。