GO学习第二章

数据类型

  1. 布尔型

    布尔型的值只可以是常量 true 或者 false

    1
    var b bool = true
  2. 数字类型

    Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码

  3. 字符串类型

    Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本

  4. 派生类型

    • 指针类型(Pointer)
    • 数组类型
    • 结构化类型(struct)
    • Channel 类型
    • 函数类型
    • 切片类型
    • 接口类型(interface)
    • Map 类型

变量

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

声明变量的一般形式是使用 var 关键字,格式为

1
var identifier type

可以一次声明多个变量

1
var identifier1, identifier2 type

变量声明

  1. 指定变量类型,如果没有初始化,则变量默认为零值

    • 数值类型(包括complex64/128)为 0

    • 布尔类型为 false

    • 字符串为 “”(空字符串)

    • 以下几种类型为 nil

      1
      2
      3
      4
      5
      6
      var a *int
      var a []int
      var a map[string] int
      var a chan int
      var a func(string) int
      var a error // error 是接口
  2. 根据值自行判定变量类型

  3. 如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误

    • 示例
    1
    2
    var intVal int 
    intVal :=1 // 这时候会产生编译错误,因为 intVal 已经声明,不需要重新声明

    可以修改为

    1
    2
    3
    4
    5
    intVal := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句
    /**intVal := 1 相等于:
    var intVal int
    intVal =1
    */

值类型和引用类型

  • 所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值

    当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝

    通过 &i 来获取变量 i 的内存地址

    值类型变量的值存储在堆中

  • 一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。

    这个内存地址称之为指针,这个指针实际上也被存在另外的某一个值中

常量

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型,格式为

1
const identifier [type] = value

可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型

  • 常量还可以用作枚举

    1
    2
    3
    4
    5
    const (
    Unknown = 0
    Female = 1
    Male = 2
    )

    比如可以用数字 0、1 和 2 分别代表未知性别、女性和男性

iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)

1
2
3
4
5
const (
a = iota
b = iota
c = iota
)

第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;所以 a=0, b=1, c=2 可以简写为如下形式

1
2
3
4
5
const (
a = iota
b
c
)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}

结果为

1
0 1 2 ha ha 100 100 7 8