Golang 变量

为什么需要变量

  1. 变量是程序的基本组成单位。
  2. 不论是使用那种高级程序语言编写程序,变量都是其程序的基本组成单位。

    变量的介绍

    变量的概念

  3. 变量相当于内存中一个数据存储空间的表示,你可以把变量看作是一个房间的门牌号,通过门牌号我们可以找到房间,同样的道理,通过变量名可以访问到变量值。

    变量使用的基本步骤

  4. 声明变量/定义变量

  5. 赋值
  6. 使用

    变量快速入门案例

  7. 案例一: ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { // 定义变量 var i int // 给 i 赋值 i = 10 fmt.Println(“i =”, i) }

  1. <a name="d05b61a0"></a>
  2. ## 变量使用注意事项
  3. 1. 变量表示内存中的一个存储区域。
  4. 1. 该区域有自己的变量名和数据类型。
  5. 1. Golang 变量使用的三种方式。
  6. - 第一种:指定变量类型,声明后若不赋值,使用默认值。
  7. - 第二种:根据值自行判定变量类型(类型推导)。
  8. - 第三种:省略 var ,注意 := 左侧变量不应该是已经声明的,否则会导致编译错误。
  9. - 多变量声明:在编程中,又是我们需要一次性声明多个变量,Golang 也提供这样的语法。
  10. - 该区域的数据值可以在同一类型范围内不断变化。
  11. - 变量在同一个作用域内不能重名。
  12. - 变量 = 变量名 + 值 + 数据类型。
  13. - Golang 的变量如果没有赋初始值,编译器会使用默认值,比如 int 默认值 0 ;string 默认值为空字符串。
  14. 4. Golang 变量使用的第一种方式
  15. ```go
  16. package main
  17. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  18. func main() {
  19. // Golang 变量的使用方式一
  20. // 第一种:指定变量类型,声明后若不赋值,使用默认值
  21. // int 默认值是 0
  22. var i int
  23. fmt.Println("i =", i) // 输出结果:i = 0
  24. }
  1. Golang 变量使用的第二种方式 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { // 第二种:根据值自行判定变量类型(类型推导) var num = 10.11 fmt.Println(“num =”, num) }

  1. 6. Golang 变量使用的第三种方式
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. func main() {
  6. // 第三种:省略 var ,注意 := 左侧变量不应该是已经声明的,否则会导致编译错误。
  7. // 下面的方式等价于 var name string name = "tom"
  8. name := "tom"
  9. fmt.Println("name =", name)
  10. }
  1. 多变量声明案例 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

func main() { //该案例演示 Golang 如何一次性声明多个变量 //var n1, n2, n3 int //fmt.Println(“n1 =”, n1, “n2 =”, n2, “n3 =”, n3)

  1. //一次性声明多个变量的方式 2
  2. //var n1, name, n3 = 100, "tom", 888
  3. //fmt.Println("n1 =", n1, "name =", name, "n3 =", n3)
  4. //一次性声明多个变量的方式 3 , 同样可以使用类型推导
  5. n1, name, n3 := 100, "tom", 888

fmt.Println(“n1 =”, n1, “name =”, name, “n3 =”, n3) }

  1. 8. 多变量声明案例(全局变量)
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. //定义全局变量
  6. var n1 = 100
  7. var n2 = 200
  8. var name = "jack"
  9. //上面的声明方式,也可以改成一次性声明
  10. var (
  11. n3 = 300
  12. n4 = 900
  13. name2 = "mary"
  14. )
  15. func main() {
  16. //输出全局变量
  17. fmt.Println("n1 =", n1, "name =", name, "n2 =",n2)
  18. fmt.Println("n3 =", n3, "name2 =", name2, "n4 =",n4)
  19. }
  1. 该区域的数据值可以在同一类型范围内不断变化-相关案例 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

//变量使用的注意事项 func main() { //该区域的数据值可以在同一类型范围内不断变化 var i int = 10 i = 30 i = 50 fmt.Println(“i =”, i) // i = 1.2 //报错,原因是不能改变数据类型 }

  1. 10. 变量在(同一个作用域或代码块)内不能重名-相关案例
  2. ```go
  3. package main
  4. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  5. // 变量使用的注意事项
  6. func main() {
  7. // 该区域的数据值可以在同一类型范围内不断变化
  8. var i int = 10
  9. i = 30
  10. i = 50
  11. fmt.Println("i =", i)
  12. // i = 1.2 //报错,原因是不能改变数据类型
  13. //变量在(同一个作用域或代码块)内不能重名
  14. // var i int = 59
  15. // i := 99
  16. }

变量的声明,初始化和赋值

  1. 变量的基本语法
    • 基本语法:var 变量名 数据类型
    • var a int 这就是声明了一个变量,变量名是 a 。
    • var num1 float32 这也声明了一个变量,表示一个单精度类型的小数,变量名是 num1 。
  2. 初始化变量

    • 在声明变量的时候,就给值 。
    • var a int = 45 这就是初始化变量 a 。
    • 使用细节:如果声明时就直接赋值,可省略数据类型。
      1. var b = 400
  3. 给变量赋值

    • 比如你先声明了变量: var num int // 默认 0
    • 然后,再给值 num = 780 ;这就是给变量赋值。

      程序中 + 号的使用

  4. 当左右两边都是数值型,则做加法运算。

  5. 当左右两边都是字符串,则做字符拼接。 ```go package main

import “fmt” // fmt 包中提供格式化、输出、输入的函数

//演示 Golang 中 + 的使用 func main() { var i = 1 var j = 2 var r = i + j // 做加法运算 fmt.Println(“r =”, r)

  1. var str1 = "hello "
  2. var str2 = "world"
  3. var res = str1 + str2 // 拼接操作
  4. fmt.Println("res =",res)

}

  1. <a name="502de832"></a>
  2. ## 变量的数据类型
  3. 1. 每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
  4. 1. 数据类型中的基本数据类型包括:数值型、字符型(没有专门的字符型、使用 byte 来保存单个字母字符)、布尔型、字符串(官方将 string 归属到基本数据类型)。
  5. 1. 数据类型中的派生/复杂数据类型:指针(Pointer)、数组、结构体(struct)、管道(Channel)、函数、切片(slice)、接口(interface)、map。
  6. 1. 数值型变量包含:整数类型(int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, byte)、浮点类型:float32/float64 。
  7. <a name="62889da4"></a>
  8. ### 整数类型
  9. <a name="f72dd4a6"></a>
  10. #### 基本介绍
  11. 1. 简单来说,就是用来存放着整数值的,比如 0,-1,2345 等。
  12. <a name="da1492b1"></a>
  13. #### 整数类型的详细介绍
  14. | 类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
  15. | --- | --- | --- | --- | --- |
  16. | int8 | 有 | 1 字节 | -128-127 | |
  17. | int16 | 有 | 2 字节 | -215~215-1 | |
  18. | int32 | 有 | 4 字节 | -231~231-1 | |
  19. | int64 | 有 | 8 字节 | -263~263-1 | |
  20. | uint8 | 无 | 1 字节 | 0~255 | |
  21. | uint16 | 无 | 2 字节 | 0~2^16-1 | |
  22. | uint32 | 无 | 2 字节 | 0~2^32-1 | |
  23. | uint64 | 无 | 2 字节 | 0~2^64-1 | |
  24. <a name="14e4ed28"></a>
  25. #### 其他类型的详细介绍
  26. | 类型 | 有无符号 | 占用存储空间 | 表数范围 | 备注 |
  27. | --- | --- | --- | --- | --- |
  28. | int | 有 | 32 位系统 4 个字节<br />64 位系统 8 个字节
  29. | [-231~231-1, -263~263-1] | |
  30. | uint | 无 | 32 位系统 4 个字节<br />64 位系统 8 个字节
  31. | [0~2^32-1, 0~2^64-1] | |
  32. | rune | 有 | 与 int32 一样 | [-2^31, 2^31-1] | 等价 int32,表示一个 Unicode 码 |
  33. | byte | 无 | 与无符号的 uint8 等价 | [0, 255] | 当要存储字符时选用 byte |
  34. <a name="24f60c15"></a>
  35. #### 案例演示
  36. ```go
  37. package main
  38. import "fmt" // fmt 包中提供格式化、输出、输入的函数
  39. //演示 Golang 中整数类型的使用
  40. func main() {
  41. var i int = 1
  42. fmt.Println("i =", i)
  43. //测试一下 int8 范围 -128~127
  44. //其他的 int16,int32,int64,类推。
  45. var j int8 = -128
  46. fmt.Println("j =", j)
  47. //var j int8 = -129 报错,-129 已经超出范围
  48. //测试一下 uint8 的范围,其他的 uint16,uint32,uint64 类推即可
  49. var k uint8 = 0
  50. fmt.Println("k =", k)
  51. //var k uint8 = -1 报错,-1 已经超出范围
  52. //int, uint, rune, byte 的使用
  53. var a int = 8900
  54. fmt.Println("a =", a)
  55. var b uint = 1
  56. fmt.Println("b =", b)
  57. var c byte = 255
  58. fmt.Println("c =", c)
  59. }

整数类型的使用细节

  1. Golang 各整数类型分:有符号和无符号,int、uint 的大小和系统有关。
  2. Golang 的整型默认声明为 int 型。 ```go package main

import ( “fmt” ) // fmt 包中提供格式化、输出、输入的函数

//演示 Golang 中整数类型的使用 func main() { //整型的使用细节 var n1 = 100 // n1 是什么类型 //查看某个变量的数据类型 //fmt.Printf()可以用于格式化输出 fmt.Printf(“n1 的类型 %T \n”, n1) }

  1. 3. 如何在程序中查看某个变量的占用字节大小和数据类型。
  2. ```go
  3. package main
  4. import (
  5. "fmt"
  6. "unsafe"
  7. ) // fmt 包中提供格式化、输出、输入的函数
  8. func main() {
  9. //如何在程序中查看某个变量的占用字节大小和数据类型
  10. var n2 int64 = 10
  11. //unsafe.Sizeof(n2) 是 unsafe 包的一个函数,可以返回 n2 变量占用的字节数。
  12. fmt.Printf("n2 的类型 %T n2 占用的字节数是 %d", n2, unsafe.Sizeof(n2))
  13. }
  1. Golang 程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。 ```go package main

import ( “fmt” ) // fmt 包中提供格式化、输出、输入的函数

func main() { // Golang 程序中整型变量在使用时,遵守保小不保大的原则 // var age int64 = 100 浪费内存 var age byte = 90 fmt.Println(“age =”, age) }

  1. 5. bit:计算机中的最小存储单位。byte:计算机中基本存储单元。
  2. <a name="5376beec"></a>
  3. ### 浮点类型
  4. <a name="f72dd4a6-1"></a>
  5. #### 基本介绍
  6. 1. Golang 的浮点类型可以表示一个小数,比如 123.47.80.12 等等。
  7. <a name="2efa0a36"></a>
  8. #### 浮点型的分类
  9. | 类型 | 占用存储 | 表数范围 |
  10. | --- | --- | --- |
  11. | 单精度 float32 | 4 个字节 | -3.403E38~3.403E38 |
  12. | 双精度 float64 | 8 个字节 | -1.798E308~1.798E308 |
  13. 1. 关于浮点数在机器中存放形式的简单说明,浮点数=符号数+指数位+尾数位。
  14. ```go
  15. package main
  16. import (
  17. "fmt"
  18. ) // fmt 包中提供格式化、输出、输入的函数
  19. //演示 Golang 中浮点数类型的使用
  20. func main() {
  21. var price float32 = 89.12
  22. fmt.Println("price =", price)
  23. var num1 float32 = -0.00089
  24. var num2 float64 = -7809656.09
  25. fmt.Println("num1 =", num1, "num2 =", num2)
  26. }
  1. 尾数部分可能丢失,造成精度损失。 ```go package main

import ( “fmt” ) // fmt 包中提供格式化、输出、输入的函数

//演示 Golang 中浮点数类型的使用 func main() { //尾数部分可能丢失,造成精度损失。 var num3 float32 = -123.0000901 var num4 float64 = -123.0000901 fmt.Println(“num3 =”, num3, “num4 =”, num4) //说明:float64 的精度比 float32 的要准确 //说明:如果我们要保存一个精度高的数,则应该选用 float64 }

  1. <a name="09348b02"></a>
  2. #### 浮点型使用细节
  3. 1. Golang 浮点类型有固定的范围和字段长度,不受具体 OS(操作系统) 的影响。
  4. 1. Golang 的浮点型默认声明为 float64 类型。
  5. 1. 浮点型常量有两种表示形式
  6. - 十进制数形式: 如:5.12 .512(必须有小数点)
  7. - 科学技术法形式: 如:5.1234e2 = 5.12 * 10 的两次方 5.12E-2 = 5.12、10 的 2 次方。
  8. 4. 通常情况下,应该使用 float64 ,因为它比 float32 更准确。
  9. 4. 浮点型使用细节的相关案例
  10. ```go
  11. package main
  12. import (
  13. "fmt"
  14. ) // fmt 包中提供格式化、输出、输入的函数
  15. //演示 Golang 中浮点数类型的使用
  16. func main() {
  17. // Golang 的浮点型默认声明为 float64 类型
  18. var num5 = 1.1
  19. fmt.Printf("num5 的数据类型是 %T \n", num5)
  20. //十进制数形式: 如:5.12 .512(必须有小数点)
  21. num6 := 5.12
  22. num7 := .123 // => 0.123
  23. fmt.Println("num6 =", num6, "num7 =", num7)
  24. //科学计数法形式
  25. num8 := 5.1234e2 // 5.1234 * 10的二次方
  26. num9 := 5.1234E2 // 5.1234 * 10的二次方
  27. num10 := 5.1234E-2 // 5.1234 / 10的二次方
  28. fmt.Println("num8 =", num8)
  29. fmt.Println("num9 =", num9)
  30. fmt.Println("num10 =", num10)
  31. }

字符类型(char)

基本介绍

  1. Golang 中没有专门的字符类型,如果要储存单个字符(字母),一般使用 byte 来保存。
  2. 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而 Go 的字符串不同,它是由字节组成的。

    相关案例

  3. 如果我们保存的字符在 ASCII 表的,比如 [0-1,a-z,A-Z] 直接可以保存到 byte 。

  4. 如果我保存的字符对应码值大于 255,这时我们可以考虑使用 int 类型保存。
  5. 如果我们需要按字符的方式输出,这时我们需要格式化输出,即 fmt.print(“%c”, c1) 。 ```go package main

import ( “fmt” ) // fmt 包中提供提供格式化、输出、输入的函数

//演示 Golang 中字符类型的使用 func main() { var c1 byte = ‘a’ var c2 byte = ‘0’ // 字符的 0

  1. //当我直接输出 byte 值,就是输出了对应的字符的码值
  2. fmt.Println("c1 =", c1)
  3. fmt.Println("c2 =", c2)
  4. //如果我们希望输出对应字符,需要使用格式化输出
  5. fmt.Printf("c1 = %c c2 = %c \n", c1, c2)
  6. //var c3 byte = '北' overflow 溢出
  7. var c3 int = '北'
  8. fmt.Printf("c3 = %c c3对应码值 = %d", c3, c3)

}

  1. <a name="1ec1316c"></a>
  2. #### 字符类型使用细节
  3. 1. 字符常量是用单引号 '' 括起来的单个字符。例如:var c1 byte = 'a' var c2 int = '中' var c3 byte = '9'。
  4. 1. Go 中允许使用转义字符来将其后的字符转变为特殊字符型常量。例如:var c3 char = '\n' // '\n' 表示换行符。
  5. 1. Go 语言的字符使用 UTF-8 编码。(英文字母 1 个字节、汉字 3个字符)
  6. 1. 在 Go 中,字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的码值。
  7. 1. 可以直接给某个变量赋一个数字,然后按格式化输出时 %c ,会输出该数字对应的 unicode 字符。
  8. ```go
  9. package main
  10. import (
  11. "fmt"
  12. ) // fmt 包中提供格式化、输出、输入的函数
  13. //演示 Golang 中字符类型的使用
  14. func main() {
  15. //可以直接给某个变量赋一个数字,然后按格式化输出时 %c ,会输出该数字对应的 unicode 字符。
  16. var c4 int = 22269 // 22269 -> '国'
  17. fmt.Printf("c4 = %c", c4)
  18. }
  1. 字符类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码。 ```go package main

import ( “fmt” ) // fmt 包中提供格式化,输出,输入的函数

//演示 Golang 中字符类型的使用 func main() { //字符类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码。 var n1 = 10 + ‘a’ // 10 + 97 = 107 fmt.Println(“n1 =”, n1) }

  1. <a name="081abb58"></a>
  2. #### 字符类型本质探讨
  3. 1. 给付型储存到计算机,需要将字符对应的码值(整数)找出来
  4. - 存储:字符 --> 对应码值 --> 二进制 --> 存储
  5. - 读取:二进制 --> 码值 --> 字符 --> 读取
  6. 2. 字符和码值是通过字符编码表决定好的(是规定好)
  7. 2. Go 语言的编码都同意成了 utf-8 ,和其他的编程语言来说。非常的方便,很统一,再没有编码的困扰了。
  8. <a name="cd29ffe6"></a>
  9. ### 布尔类型
  10. <a name="f72dd4a6-3"></a>
  11. #### 基本介绍
  12. 1. 布尔类型也叫 bool 类型,bool 类型数据只允许取值 true 和 false 。
  13. 1. bool 类型占一个字节。
  14. 1. bool 类型适于逻辑运算,一般用于程序流程控制。
  15. - if 条件控制语句
  16. - for 循环控制语句
  17. 4. 相关案例
  18. ```go
  19. package main
  20. import (
  21. "fmt"
  22. "unsafe"
  23. )
  24. //演示 Golang 中 bool 类型的使用
  25. func main() {
  26. var b = false
  27. fmt.Println("b =", b)
  28. //注意事项
  29. //bool 类型占用存储空间是 1 个字节
  30. fmt.Println("b 的占用空间 =", unsafe.Sizeof(b))
  31. //bool 类型只能取 true 或者 false
  32. }

字符串类型

基本介绍

  1. 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。

    快速入门案例

    ```go package main

import ( “fmt” )

//演示 Golang 中 string 类型的使用 func main() { //string 的基本使用 var address string = “北京长城 110 hello world!” fmt.Println(address)

}

  1. <a name="6c1f65b4"></a>
  2. #### 注意事项和使用细节
  3. 1. Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本,这样 Golang 统一使用 UTF-8 编码,乱码的问题不会再困扰程序员。
  4. 1. 字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  5. ```go
  6. package main
  7. import (
  8. "fmt"
  9. )
  10. //演示 Golang 中 string 类型的使用
  11. func main() {
  12. //string 的基本使用
  13. var address string = "北京长城 110 hello world!"
  14. fmt.Println(address)
  15. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  16. //var str = "hello"
  17. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  18. }
  1. 字符串的两种表示形式
    • 双引号,会识别转义字符
    • 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。 ```go package main

import ( “fmt” )

//演示 Golang 中 string 类型的使用 func main() { //string 的基本使用 var address string = “北京长城 110 hello world!” fmt.Println(address)

  1. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  2. //var str = "hello"
  3. //str[0] = 'a' 这里就不能去修改str的内容,即 Go 中的字符串是不可变的。
  4. //(1) 双引号,会识别转义字符
  5. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  6. str2 := "abd\nabc"
  7. fmt.Println(str2)
  8. //使用的反引号 ``
  9. str3 := `
  10. package main
  11. import (
  12. "fmt"
  13. )
  14. //演示 Golang 中 string 类型的使用
  15. func main() {
  16. //string 的基本使用
  17. var address string = "北京长城 110 hello world!"
  18. fmt.Println(address)
  19. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  20. //var str = "hello"
  21. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  22. //(1) 双引号,会识别转义字符
  23. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  24. str2 := "abd\nabc"
  25. fmt.Println(str2)
  26. }
  27. `
  28. fmt.Println(str3)

}

  1. 4. 字符串的拼接方式
  2. ```go
  3. package main
  4. import (
  5. "fmt"
  6. )
  7. //演示 Golang 中 string 类型的使用
  8. func main() {
  9. //string 的基本使用
  10. var address string = "北京长城 110 hello world!"
  11. fmt.Println(address)
  12. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  13. //var str = "hello"
  14. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  15. //(1) 双引号,会识别转义字符
  16. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  17. str2 := "abd\nabc"
  18. fmt.Println(str2)
  19. //使用的反引号 ``
  20. str3 := `
  21. package main
  22. import (
  23. "fmt"
  24. )
  25. //演示 Golang 中 string 类型的使用
  26. func main() {
  27. //string 的基本使用
  28. var address string = "北京长城 110 hello world!"
  29. fmt.Println(address)
  30. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  31. //var str = "hello"
  32. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  33. //(1) 双引号,会识别转义字符
  34. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  35. str2 := "abd\nabc"
  36. fmt.Println(str2)
  37. }
  38. `
  39. fmt.Println(str3)
  40. //字符串拼接方式
  41. var str4 = "hello " + "world"
  42. str4 += " haha!"
  43. fmt.Println(str4)
  44. }
  1. 当一行字符串太长,需要使用到多行字符串,可以如下处理: ```go package main

import ( “fmt” )

//演示 Golang 中 string 类型的使用 func main() { //string 的基本使用 var address string = “北京长城 110 hello world!” fmt.Println(address)

  1. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  2. //var str = "hello"
  3. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  4. //(1) 双引号,会识别转义字符
  5. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  6. str2 := "abd\nabc"
  7. fmt.Println(str2)
  8. //使用的反引号 ``
  9. str3 := `
  10. package main
  11. import (
  12. "fmt"
  13. )
  14. //演示 Golang 中 string 类型的使用
  15. func main() {
  16. //string 的基本使用
  17. var address string = "北京长城 110 hello world!"
  18. fmt.Println(address)
  19. //字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
  20. //var str = "hello"
  21. //str[0] = 'a' 这里就不能去修改 str 的内容,即 Go 中的字符串是不可变的。
  22. //(1) 双引号,会识别转义字符
  23. //(2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  24. str2 := "abd\nabc"
  25. fmt.Println(str2)
  26. }
  27. `
  28. fmt.Println(str3)
  29. //字符串拼接方式
  30. var str4 = "hello " + "world"
  31. str4 += " haha!"
  32. fmt.Println(str4)
  33. //当一个拼接的操作很长时,可以分行写。加号要写在上面一行。
  34. var str5 = "hello " + "world" +
  35. " hello " + "world"
  36. fmt.Println(str5)

}

  1. <a name="087561ac"></a>
  2. ### 基本数据类型默认值
  3. <a name="f72dd4a6-5"></a>
  4. #### 基本介绍
  5. 1. 在 Go 中,数据类型都有一个默认值,当程序员没有赋值时,就会保留默认值,在 Go 中,默认值又叫零值。
  6. 1. 基本数据类型默认值如下:
  7. | 数据类型 | 默认值 |
  8. | --- | --- |
  9. | 整型 | 0 |
  10. | 浮点型 | 0 |
  11. | 字符串 | "" |
  12. | 布尔类型 | false |
  13. 3. 相关案例
  14. ```go
  15. package main
  16. import "fmt"
  17. //演示 Golang 中基本数据类型默认值的使用
  18. func main() {
  19. var a int // 0
  20. var b float32 // 0
  21. var c float64 // 0
  22. var isMarried bool // false
  23. var name string // ""
  24. //这里的 %v 表示按照变量的值输出
  25. fmt.Printf("a = %d, b = %f, c = %f, isMarried = %v, name = %v", a, b, c, isMarried, name)
  26. fmt.Printf("a = %d, b = %v, c = %v, isMarried = %v, name = %v", a, b, c, isMarried, name)
  27. }

基本数据类型的转换

基本介绍

  1. Golang 和 Java/C 不同,Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Golang 中数据类型不能自动转换。

    基本语法

  2. 表达式 T(v) 将值 v 转换为类型 T

    • T: 就是数据类型,比如 int32、int64、float32 等
    • v: 就是需要转换的变量

      细节说明

  3. Go 中,数据类型的转换可以是从表示范围小—>表示范围大,也可以范围大—>范围小。

  4. 被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!
  5. 在转换中,比如将 int64 转换成 int8 ,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。
  6. 相关案例如下: ```go package main

import “fmt”

//演示 Golang 中基本数据类型的转换 func main() { var i int32 =100 //希望将 i => float var n1 float32 = float32(i) var n2 int8 = int8(i) var n3 int64 = int64(i) //低精度 -> 高精度(仍然要强制转换)

  1. fmt.Printf("i = %v n1 = %v n2 = %v n3 = %v \n", i, n1, n2, n3)
  2. //被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化。
  3. fmt.Printf("i type is %T \n", i)
  4. //在转换中,比如将 int64 转换成 int8 ,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。
  5. var num1 float64 = 999999
  6. var num2 int8 = int8(num1)
  7. fmt.Println("num2 =", num2)

}

  1. <a name="b8728ea3"></a>
  2. ### 基本数据类型和 string 的转换
  3. <a name="f72dd4a6-7"></a>
  4. #### 基本介绍
  5. 1. 在程序开发中,我们经常需要将基本数据类型转成 string 类型,或者将 string 类型转换成基本数据类型。
  6. <a name="3be709cc"></a>
  7. #### 基本数据类型转 string 类型
  8. 1. 方式1:fmt.Sprintf("%参数",表达式)
  9. - 参数需要和表达式的数据类型相匹配
  10. - fmt.Sprintf() 会返回转换后的字符串
  11. 2. 方式2:使用 strconv 包的函数
  12. <a name="63aeb042-1"></a>
  13. #### 相关案例
  14. <a name="b68b75ea"></a>
  15. ##### 方式一:
  16. ```go
  17. package main
  18. import "fmt"
  19. //演示 Golang 中基本数据类型转成 string 使用
  20. func main() {
  21. var num1 int = 99
  22. var num2 float64 = 23.456
  23. var b bool = true
  24. var myChar byte = 'h'
  25. var str string //空的 str
  26. //使用第一种方式来转换 fmt.Sprintf 方法
  27. str = fmt.Sprintf("%d", num1)
  28. fmt.Printf("str type %T str = %v \n", str, str)
  29. str = fmt.Sprintf("%f", num2)
  30. fmt.Printf("str type %T str = %v \n", str, str)
  31. str = fmt.Sprintf("%t", b)
  32. fmt.Printf("str type %T str = %v \n", str, str)
  33. str = fmt.Sprintf("%c", myChar)
  34. fmt.Printf("str type %T str = %v", str, str)
  35. }

方式二:
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. //演示 Golang 中基本数据类型转成 string 使用
  7. func main() {
  8. //第二种方式 strconv 函数
  9. var num3 int = 99
  10. var num4 float64 = 23.456
  11. var b2 bool = true
  12. str = strconv.FormatInt(int64(num3),10)
  13. fmt.Printf("str type %T str = %v \n", str, str)
  14. //说明:'f' 格式 10:表示小数位保留 10 位 64:表示这个小数 float64 。
  15. str = strconv.FormatFloat(num4, 'f', 10, 64)
  16. fmt.Printf("str type %T str = %v \n", str, str)
  17. str = strconv.FormatBool(b2)
  18. fmt.Printf("str type %T str = %v \n", str, str)
  19. //strconv 包中有一个函数 Itoa
  20. var num5 int64 = 4567
  21. str = strconv.Itoa(int(num5))
  22. fmt.Printf("str type %T str = %v", str, str)
  23. }

string 类型转基本数据类型

  1. 使用 strconv 包的函数 ```go package main

import ( “fmt” “strconv” )

//演示 Golang 中 string 转成基本数据类型 func main() {

  1. var str string = "true"
  2. var b bool
  3. //b, _ = strconv.ParseBool(str)
  4. //1. strconv.ParseBool(str) 函数会返回两个值(value bool, err error)
  5. //2. 因为我只想获取到 value bool ,不想获取 err ,所以使用 _ 忽略。
  6. b, _ = strconv.ParseBool(str)
  7. fmt.Printf("b type %T b = %v \n", b, b)
  8. var str2 string = "1234590"
  9. var n1 int64
  10. var n2 int
  11. n1, _ = strconv.ParseInt(str2, 10, 64)
  12. n2 = int(n1)
  13. fmt.Printf("n1 type %T n1 = %v \n", n1, n1)
  14. fmt.Printf("n2 type %T n2 = %v \n", n2, n2)
  15. var str3 string = "123.456"
  16. var f1 float64
  17. f1, _ = strconv.ParseFloat(str3, 64)
  18. fmt.Printf("f1 type %T f1 = %v \n", f1, f1)

}

  1. 2. 函数一般返回 int64 或者 float64 ,如果要获得 int32 float32 ,还需加一步转换。
  2. <a name="1bbbb204"></a>
  3. #### 注意事项
  4. 1. 在将 String 类型转成基本数据类型时,要确保 String 类型能够转成有效的数据,比如我们可以把 "123",转成一个整数,但是不能把 "hello" 转成一个整数,如果这样做,Golang 直接将其转成 0
  5. ```go
  6. package main
  7. import (
  8. "fmt"
  9. "strconv"
  10. )
  11. //演示 Golang 中 string 转成基本数据类型
  12. func main() {
  13. var str string = "true"
  14. var b bool
  15. //b, _ = strconv.ParseBool(str)
  16. //1. strconv.ParseBool(str)函数会返回两个值(value bool, err error)
  17. //2. 因为我只想获取到 value bool,不想获取 err,所以使用 _ 忽略。
  18. b, _ = strconv.ParseBool(str)
  19. fmt.Printf("b type %T b = %v \n", b, b)
  20. var str2 string = "1234590"
  21. var n1 int64
  22. var n2 int
  23. n1, _ = strconv.ParseInt(str2, 10, 64)
  24. n2 = int(n1)
  25. fmt.Printf("n1 type %T n1 = %v \n", n1, n1)
  26. fmt.Printf("n2 type %T n2 = %v \n", n2, n2)
  27. var str3 string = "123.456"
  28. var f1 float64
  29. f1, _ = strconv.ParseFloat(str3, 64)
  30. fmt.Printf("f1 type %T f1 = %v \n", f1, f1)
  31. //注意事项: 在将 String 类型转成基本数据类型时,要确保 String 类型能够转成有效的数据,比如我们可以把 "123" ,转成一个整数,但是不能把 "hello" 转成一个整数,如果这样做,Golang 直接将其转成 0 。
  32. //哪怕 var n3 int64 = 11,最后 n3 结果还是 0 。
  33. var str4 string = "hello"
  34. var n3 int64
  35. n3, _ = strconv.ParseInt(str4, 10, 64)
  36. fmt.Printf("n3 type %T n3 = %v \n", n3, n3)
  37. }

指针

基本介绍

  1. 基本数据类型,变量存的就是值,也叫值类型。
  2. 获取变量的地址,用 & ,比如: var num int,获取 num 的地址:&num
  3. 指针类型,变量存的是一个地址,这个地址指向的空间存的才是值。比如:var ptr *int = &num
  4. 获取指针类型指向的值,使用: _,比如: var ptr _int,使用 *ptr 获取 ptr 指向值。
  5. 相关案例 ```go //案例一 package main

import “fmt”

//演示 Golang 中 指针类型 func main() { //基本数据类型在内存布局 var i int = 10 // i 的地址是什么,&i fmt.Println(“i 的内存地址 =”, &i)

  1. //下面的 var ptr *int = &i
  2. //1. ptr 是一个指针变量
  3. //2. ptr 的类型 *int
  4. //3. ptr 本身的值 &i
  5. var ptr *int = &i
  6. fmt.Printf("ptr = %v \n", ptr)
  7. fmt.Printf("ptr 的地址 = %v \n", &ptr)
  8. fmt.Printf("ptr 指向的值 = %v", *ptr)

}

  1. ```go
  2. //案例二
  3. package main
  4. import "fmt"
  5. //演示 Golang 中 指针类型
  6. func main() {
  7. //1. 写一个程序,获取一个 int 变量 num 的地址,并显示到终端。
  8. //2. 将 num 的地址赋给指针 ptr ,并通过 ptr 去修改 num 值。
  9. var num int = 9
  10. fmt.Printf("num address = %v \n", &num)
  11. var ptr *int
  12. ptr = &num
  13. *ptr = 10
  14. fmt.Println("num =", num)
  15. }
  1. //案例三
  2. package main
  3. import "fmt"
  4. //演示 Golang 中 指针类型
  5. func main() {
  6. //深入理解指针案例
  7. var a int = 300
  8. var b int = 400
  9. var ptr *int = &a
  10. *ptr = 100
  11. ptr = &b
  12. *ptr = 200
  13. fmt.Printf("a = %d, b = %d, *ptr = %d", a, b, *ptr)
  14. }

指针的细节说明

  1. 值类型,都有对应的指针类型,形式为 _ 数据类型,比如 int 的对应的指针就是 _int,float32 对应的指针类型就是 *float32 ,依此类推。
  2. 值类型包括:基本数据类型 int 系列、float 系列、bool、string、数组和结构体 struct。

    值类型和引用类型

    常见的值类型和引用类型

  3. 值类型:基本数据类型 int 系列、float 系列、bool、string、数组和结构体 struct 。

  4. 引用类型:指针、slice 切片、map、管道 chan、interface 都是引用类型。

    值类型和引用类型使用特点

  5. 值类型:变量直接存储值,内存通常在栈中分配。

  6. 引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由 GC 来回收。

    标识符的命名规范

    标识符概念

  7. Golang 对各种变量、方法、函数等命令时使用的字符序列称为标识符。

  8. 凡是自己可以起名字的地方都叫标识符。

    标识符的命名规则

  9. 由 26 个英文字母大小写,0-9 ,_ 组成。

  10. 数字不可以开头。
  11. Golang 中严格区分大小写。 ```go package main

import “fmt”

//演示 Golang 中标识符的使用 func main() { //Golang 中严格区分大小写 //Golang 中认为 num 和 Num 是不同的变量 var num int64 = 10 var Num int64 = 12 fmt.Println(“num =”, num, “Num =”, Num) fmt.Printf(“num = %v Num = %v”, num, Num) }

  1. 4. 标识符不能包含空格。
  2. ```go
  3. package main
  4. import "fmt"
  5. //演示 Golang 中标识符的使用
  6. func main() {
  7. //Golang 中严格区分大小写
  8. //Golang 中认为 num 和 Num 是不同的变量
  9. var num int64 = 10
  10. var Num int64 = 12
  11. fmt.Println("num =", num, "Num =", Num)
  12. fmt.Printf("num = %v Num = %v", num, Num)
  13. //标识符不能包含空格
  14. //var ab c int = 30
  15. }
  1. 下划线 _ 本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任何其他的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用。 ```go package main

import “fmt”

//演示 Golang 中标识符的使用 func main() { //Golang 中严格区分大小写 //Golang 中认为 num 和 Num 是不同的变量 var num int64 = 10 var Num int64 = 12 fmt.Println(“num =”, num, “Num =”, Num) fmt.Printf(“num = %v Num = %v”, num, Num)

  1. //标识符不能包含空格
  2. //var ab c int = 30
  3. //_是空标志符,用于占用
  4. //var _ int = 40

}

  1. 6. 不能以系统保留关键字作为标识符,比如 breakif 等等...。
  2. ```go
  3. package main
  4. import "fmt"
  5. //演示 Golang 中标识符的使用
  6. func main() {
  7. //Golang 中严格区分大小写
  8. //Golang 中认为 num 和 Num是不同的变量
  9. var num int64 = 10
  10. var Num int64 = 12
  11. fmt.Println("num =", num, "Num =", Num)
  12. fmt.Printf("num = %v Num = %v \n", num, Num)
  13. //标识符不能包含空格
  14. //var ab c int = 30
  15. //_是空标志符,用于占用
  16. //var _ int = 40
  17. //语法通过,但是尽量不要使用
  18. var int int = 90
  19. fmt.Println(int)
  20. }

标识符命名注意事项

  1. 包名:保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和标准库冲突。
  2. 变量名、函数名、常量名:采用驼峰法。
  3. 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用(注:可以简单的理解成,首字母大写是公有的,首字母小写是私有的) ```go //目录: /Users/mac/Desktop/GoProject/src/go_code/chapter03/variable_case_19/main/main.go package main

import ( “fmt” //为了使用 utils.go 文件的变量或者函数,我们需要先引入该包 “GoProject/src/go_code/chapter03/variable_case_19/model” )

//演示 Golang 中标识符的使用 func main() { //我们使用 utils.go 的 heroName 包名.标识符 //fmt.Println(model.heroName) 首字母小写表示私有,无法导入 fmt.Println(model.HeroName) }

//目录: /Users/mac/Desktop/GoProject/src/go_code/chapter03/variable_case_19/model/utils.go

package model

//定义变量 //var heroName string = “宋江” var HeroName string = “公孙胜”

  1. <a name="a713283c"></a>
  2. #### 保留关键字介绍
  3. 1. 在 Go 中,为了简化代码编译过程中对代码的解析,其定义的保留关键字只有 25 个。
  4. | 保留关键字 | 保留关键字 | 保留关键字 | 保留关键字 | 保留关键字 | 保留关键字 |
  5. | --- | --- | --- | --- | --- | --- |
  6. | break | default | func | interface | select | |
  7. | case | defer | go | map | struct | |
  8. | chan | else | goto | package | switch | |
  9. | const | fallthrought | if | range | type | |
  10. | continue | for | import | return | var | |
  11. <a name="cc8fe805"></a>
  12. #### 预定义标识符介绍
  13. 1. 除了保留关键字外,Go 还提供了 36 个预定的标识符,其中包括基础数据类型和系统内嵌函数。
  14. | 预定义标识符 | 预定义标识符 | 预定义标识符 | 预定义标识符 | 预定义标识符 | 预定义标识符 |
  15. | --- | --- | --- | --- | --- | --- |
  16. | append | bool | byte | cap | close | complex |
  17. | complex64 | complex128 | unit16 | copy | false | float32 |
  18. | float64 | imag | int | int8 | int16 | int16 |
  19. | int32 | int64 | iota | len | make | new |
  20. | nil | panic | uint64 | print | println | real |
  21. | recover | string | true | uint | uint8 | unitprt |
  22. <a name="7cb3a749"></a>
  23. ## 常量
  24. <a name="1f0287e9"></a>
  25. ### 常量介绍
  26. 1. 常量使用 const 修改
  27. 1. 常量在定义的时候,必须初始化
  28. 1. 常量不能修改
  29. 1. 常量只能修饰 bool、数值类型(int、float 系列)、string 类型
  30. 1. 语法
  31. ```go
  32. const identifier [type] = value
  1. 举例说明 ```go package main

import “fmt”

func main() { var num int num = 90 // ok // 常量在声明的时候,必须赋值 const tax int = 0 // 常量是不能修改 // tax = 10 // 常量只能修饰 bool、数值类型(int、float 系列)、string 类型(基本数据类型) // const name = “Tom” // ok // const tax float64 = 0.8 // ok // const a int //error // const b = 9 /3 // ok // const c = getVal() // error

  1. fmt.Println(num, tax)

}

  1. <a name="3989108b"></a>
  2. ### 常量的注意事项
  3. 1. 比较简洁的写法
  4. ```go
  5. const (
  6. a = 1
  7. b = 2
  8. )
  1. 专业写法

    1. func main() {
    2. const (
    3. a = iota //逐行递增
    4. b
    5. c
    6. )
    7. fmt.Println(a, b, c) // 0, 1, 2
    8. }
  2. Golang 中没有常量名必须字母大写的规范

  3. 仍然通过首字母的大小写来控制常量的访问范围

课程来源