注:GO系列文章是 雨痕《Go语言学习笔记》的读书笔记,仅用于个人学习记录,侵权删。
2.1 变量
定义
var x int //自动初始化为0
var y = flase //自动类型推断为bool类型
var x, y int //相容类型的多个变量
var m, n = 100, "hello" //不同类型的初始化
简短模式
-
简短模式的限制:
① 定义变量,同时显示初始化
② 不能提供数据类型
③ 只能在函数内部使用
-
简短模式的优势:
定义在函数多返回值,以及
if、for、switch
等语句中定义局部变量非常方便x := 100 //简短模式单变量赋值 x, y := 1, 2 //多变量赋值 x, y = y+3, x+2 //
-
退化赋值
最少有一个新变量被定义,且必须是同一作用域
func main() { x := 100 fmt.Println(&x, x) x := 200 //注意: 语法错误 x, y := 200, "abc" //注意: x退化为赋值操作,仅有y是变量定义 fmt.Println(&x, x, y) } //运行结果 0xc0000b4008 100 0xc0000b4008 200 abc
func main() { x := 100 fmt.Println(&x, x) { x, y := 200, 300 //不同的作用域,全是新变量的定义,两个x的地址不同 fmt.Println(&x, x, y) } } //运行结果 0xc000016058 100 0xc000016068 200 300
2.2 命令
命名建议
- 以字母或下画线开始,由多个字母、数字和下画线组合而成。
- 区分大小写。
- 使用驼峰( camel case )拼写格式。
- 局部变量优先使用短名。
- 不要 使用保留关键字。
- 不建议使用与预定 义常量、类型、内置函数相同的名字。
- 专有名词通常 会全部大写,例如escapeHTML。
符号名字首字母大小写决定了其作用域。首字母大写的为导出成员,可被包外引用,而小写则仅能在包内使用。
空标识符
"_"
下划线通常作为忽略占位符使用,可做表示式左值,无法读取内容。import ( "fmt" "strconv" ) func main() { x, _ := strconv.Atoi("12") //将字符串转成int fmt.Println(x) } //运行结果 12
空标识符可以用来临时规避编译器对未使用变量和导入包的错误检查。但空标识符是预置成员,不能重新定义。
2.3 常量
- 定义
常量值必须是编译期间可以确定的字符、字符串、数字或布尔值。const x, y int = 123, 0x22 const s = "hello, world" const c = 'c'
2.4基本类型
类型 | 长度 | 默认值 | 说明 |
---|---|---|---|
bool | 1 | false | |
byte | 1 | 0 | unit8 |
int,unit | 4,8 | 0 | 默认整数类型,依据目标平台,32或64位 |
int8,unit8 | 1 | 0 | -128 ~ 127, 0 ~255 |
int16,unit16 | 2 | 0 | -32768 ~ 127, 0 ~65535 |
int32,unit632 | 4 | 0 | -21亿 ~ 21亿, 0 ~42亿 |
int64,unit64 | 8 | 0 | |
float32 | 4 | 0.0 | |
float64 | 8 | 0.0 | |
complex64 | 8 | ||
complex128 | 16 | ||
rune | 4 | 0 | Unicode Code Point, int32 |
unitptr | 4,8 | 0 | 足以存储指针的null |
string | ”“ | 字符串,默认值为空字符串,而非NULL | |
array | 数组 | ||
struct | 结构体 | ||
function | nil | 函数 | |
interface | nil | 接口 | |
map | nil | 字典,引用类型 | |
slice | nil | 切片,引用类型 | |
channel | nil | 通道引用类型 |
- 别名
别名类型无须转换,可以直接赋值byte alias for uint8 rune alias for int32
func test(x byte) { println(x) }
2.5 引用类型
所谓的引用类型特指 slice、map、channel
这三种预定义类型。引用类型拥有更加复杂的存储结构。
引用类型必须使用make
函数创建,编译器会将make
转换为目标类型专用的创建函数。
func mkmap() map[string]int {
m := make(map[string]int)
m["a"] = 1
return m
}
func main() {
m := mkmap()
println(m["a"])
}
//运行结果
1
2.6 类型转换
隐式转换造成的问题远大于它带来的好处。
除了常量、别名类型以未命名类型外,Go强制要求使用显示类型转换。
a := 10
b := byte(a)
c := a + int(b) //混合类型表示式必须确保类型一致
2.7 自定义类型
使用关键字type
定义用户自定义类型。
type flags byte