变量和常量 | 青训营笔记

118 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

1. 变量

  1. 由于Go语言是静态类型的语言,所以声明变量的时候要指定变量的类型:var name type
    1. var是声明变量的关键字
    2. name是变量名
    3. type是变量类型
  1. 当使用var关键字声明变量的时候,如果没有给变量赋初始值的话,编译器会根据类型自动的赋于变量初始值,通常整数是0,浮点数是0.0,布尔值是false,字符串是""
  2. 变量的命名遵循驼峰命名规则,即组成变量的第一个单词首字母小写,后面的全部首字母大写
  3. 变量声明有下面这几种格式
// 1. 标准格式:var name type
var a1 int  // 此时a1变量有默认值0
var a2 int = 1  // 此时a2变量有初始值1
var a3 = 1  // 实际上如果使用IDE的话编辑器推荐这样写,会自动进行类型推断
var b1, b2 int  // 还可以声明多个,此时b1和b2都是int整型
var b3, b4 = 1, 2  // 可以声明的时候就赋值

// 2. 批量格式
var (
    a4 int
    a5 float32
    a6 string
)  // 这种没有指定初始值
var (
    a7 = 1
    a8 = 1.1
    a9 = "hello, world!"
)  // 这种是指定了初始值的


// 3. 简洁模式:变量名 := 变量值
a10 := 10  // 举一个栗子
a11, a12 := 11, 12  // 再举一个栗子
// 有如下限制需要注意一下:
// 1. 简洁模式不需要使用var关键字,并且需要显示化赋值
// 2. 简洁模式不能提供数据类型
// 3. 简洁模式只能定义局部变量,不能定义全局变量
// 4. 简洁模式定义的变量前面不能出现
// 什么时候需要使用简洁模式?
// 在不太需要变量类型或者是需要显式赋值的时候
  1. Go语言中也有局部变量和全局变量的说法,至于区别这里不再赘述,但是如果局部变量和全局变量同名的话,会优先考虑局部变量
  2. 可以使用unsafe.Sizeof()方法统计变量所占用的字节数
  3. 变量命名规则
    1. 变量由字母(大小写都可),数字,下划线组成
    2. 数字不能开头
    3. 变量中间不能包含空格
    4. 严格区分大小写
    5. 单独一个下划线不能作为变量,通常单独的下划线是作为返回值的占位符使用的,表示不需要获取某个返回值
    6. 不要使用系统保留关键字作为变量名,像if、for这些关键字都不能使用
    7. 可以使用int、float32这样的变量名,但相信一般人不会这么做的吧

2. 常量

1. 常量

  1. Go语言中不需要改变的量我们就定义为常量,使用const关键字
  2. 常量是在编译的时候就被创建的
  3. 常量只能声明为布尔类型,数字(整数和浮点数)类型、字符串类型
  4. 常量右边的赋值可以是一个式子,但必须能在编译期的时候就确定其值嗯

2. 常量声明

// 1. 声明数据类型
const a int = 1

// 2. 不声明数据类型,编译器自动进行类型推断(更推荐这种写法)
const b = 1

// 3. 右边可以是一个算数表达式
const c = 5 / 2

// 4. 批量声明多个常量
const (
    d = 1
    e = 1
)

3. 常量生成器iota

  1. 在—个const声明语句中,在第一个声明的常量所在的行iota会被置为0,之后的每—个有

常量声明的行会被加1

  1. 比如说我们定义东西南北四个方向
type Direction int
const (
    North Direction = iota
    South
    East
    West
)
  1. 这里补充一下type这个关键字的定义
// 1. type可以定义结构体
type Student struct {
    no int
    name string
}

// 2. type可以定义接口类型
type test interface {
    fun1() string
    fun2() string
}

// 3. type可以定义类型
type Integer int
/*
我们可以使用Integer来指定变量类型,如:var a1 Integer
这个时候a1也只能赋值为整型,但是需要注意的是类型是main.int而不是int
为什么要重新用int定义一个类型,有什么好处?
Go语言规定不能给int这种内置的基础类型添加方法,但是我们自定义类型是可以添加方法的
比如说:
func (a Integer) Add(b Integer) Integer {
	return a + b
}
func (a Integer) Sub(b Integer) Integer {
	return a -b
}
上面就给Integer添加了两个方法,那么Integer定义出来的变量就可以使用这个方法,还是扩展很方便的

// 4. type可以给类型取别名
type Integer = int
*/

4. 常量类型延迟

  1. Go语言中的常量定义的时候我们可以指定类型也可以不指定类型
  2. Go语言中不定义常量类型的时候就会延迟类型创建,这个时候变量可以直接赋值给不同类型的变量,比如说无符号的浮点型就可以赋值给float32或者是float64类型的,无符号的整型就可以赋值给int、int8、int16、int32或是int64类型。但是如果指定了常量的类型,并且将常量赋值给其它不同类型的变量的话就需要进行强制类型转换

补充:

1. 包的声明

  1. 每一个Go源文件的开头都是一个package声明:package xxx
    1. package是声明包的关键字
    2. xxx是包的名称
  1. 一般来说Go语言的包具有如下特性:
    1. 一个目录下的同级文件属于同一个包
    2. 包名和目录名可以不相同(但是一般都是一样的),且不和标准库冲突
    3. main包是Go语言程序的入口包。一个Go语言程序有且仅有一个main包,多一个少一个都不行,如果没有main包的话编译的时候就会报错,无法生成可执行文件
  1. 一个目录只能有一个软件包
  2. 想要引用别的包中的函数的话,要求函数名大写
  3. 当包名太长的话可以给包定义别名

2. 包的导入

  1. 使用import关键字导包,注意包名要用""引用起来
  2. 导入包有以下几种情况
  • 导入一个包
import "fmt"
  • 导入多个包,使用()括起来,并且不同包之间换行即可不需要逗号,
import (
  "fmt"
	"os"
)
  • 导入多个包并且取别名,这个时候可以使用别名代替包名
import (
	alias1 "os"
  alias2 "fmt"
)
  • 如果不想使用包中的变量或者函数,只是想初始化包的话就可以使用下划线_代替,此时再在代码中使用这个包的话编译器会报错undefined
import (
	_ "os"
	alias1 "fmt"
)