常量指针
- 常量
- 指针
- 类型别名
- 注释
常量
Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
声明格式:
const name [type] = value
type可以省略
和变量声明一样,可以批量声明多个常量:
const (e = 2.7182818pi = 3.1415926
)
如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的。例如:
const (a = 1bc = 2d
)
fmt.Println(a, b, c, d) // "1 1 2 2"
iota 常量生成器
常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。
在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明的行加1
如:
const (Sunday = iota //0MondayTuesdayWednesdayThursdayFridaySaturday //6
)
指针
指针(pointer)在Go语言中可以被拆分为两个核心概念:
- 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。
- 切片(可变数组),由指向起始元素的原始指针、元素数量和容量组成。
指针理解:在内存中开辟了一片空间,空间内存放着数值10,这片空间在整个内存当中,有一个唯一的地址,用来进行标识,指向这个地址的变量就称为指针
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。
当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作)
当使用&操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用*操作符,也就是指针取值
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值
创建指针的另一种方法:
new() 函数可以创建一个对应类型的指针,创建过程会分配内存,被创建的指针指向默认值。
new(类型)
类型别名
格式:
//TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类型,就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。
type TypeAlias = Type
还有一种是类型定义:
//定义Name为Type类型 ,定义之后 Name为一种新的类型
type Name Type
两种方法区别:
package main
import ("fmt"
)
// 将NewInt定义为int类型
type NewInt int
// 将int取一个别名叫IntAlias
type IntAlias = int
func main() {// 将a声明为NewInt类型var a NewInt`//单行注释`// 查看a的类型名 main.NewIntfmt.Printf("a type: %T\n", a)// 将a2声明为IntAlias类型var a2 IntAlias// 查看a2的类型名 int //IntAlias 类型只会在代码中存在,编译完成时,不会有 IntAlias 类型。fmt.Printf("a2 type: %T\n", a2)
}
注释
单行注释:
//单行注释
多行注释:
/*
第一行注释
第二行注释
...
*/