[TOC]
## 变量声明
变量声明以关键字`var`开头,变量类型放在变量的后面,行尾无需分号
~~~
var 变量名 变量类型
~~~
eg:
~~~
var name string
~~~
## 批量声明
每声明一个变量就需要写`var`关键字会比较繁琐,go语言中还支持批量变量声明:
~~~
var (
name string
age int
is_beauty bool
height float64
)
~~~
## 变量的初始化
Go语言在声明变量的时候,会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值;
例如:
整型和浮点型变量的默认值为`0`;
字符串变量的默认值为`空字符串`;
布尔型变量默认为`false`;
切片、函数、指针变量的默认为`nil`
在声明变量的时候为其指定初始值。变量初始化的标准格式如下:
~~~
var 变量名 类型 = 表达式
~~~
eg:
~~~
var name string = "叫我小叮当啊"
~~~
一次初始化多个变量
~~~
var name, age = "叫我小叮当啊", 18
~~~
### 类型推导
有时候可以将变量的 类型 省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。
~~~
var name = "叫我小叮当啊"
var age = 18
~~~
### 短变量声明
在函数内部,可以使用更简略的`:=`方式声明并初始化变量。
~~~
package main
import (
"fmt"
)
// 全局变量xdd
var xdd = 1
func main() {
dx := 10
xdd1 := 200 // 局部变量xdd
fmt.Println(xdd, dx , xdd1)//1 10 200
}
~~~
### 匿名变量
在使用多重赋值时,如果想要忽略某个值,可以使用`匿名变量(anonymous variable)`。 匿名变量用一个下划线`_`表示
~~~
package main
import (
"fmt"
)
funcxdd() (string, int) {
return "叫我小叮当啊", 18
}
funcmain() {
name, _ := xdd()
_, age := xdd()
fmt.Println(name, age)
}
~~~
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。
注意事项:
1. 函数外的每个语句都必须以关键字开始(var、const、func等)
2. `:=` 要在函数内部使用,不能使用在函数外。
3. `_`多用于占位,表示忽略值
## 常量
相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。 常量的声明和变量声明非常类似,只是把`var`换成了`const`,常量在定义的时候必须赋值。
只声明一个:
~~~
const pi = 3.1415
~~~
同时声明多个:
~~~
const (
pi = 3.1415
e = 2.7182
)
~~~
const同时声明多个常量时,如果省略了值则表示和上面一行的值相同。 eg:
~~~
const (
x1 = 100
d2
d3
)
~~~
上面示例中,常量`x1`、`d2`、`d3`的值都是100。
## iota
1.在const关键字出现时将被重置为0
2.每新增一行常量声明将使`iota`计数一次
使用iota能简化定义,在`定义枚举`时很有用。
~~~
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
~~~
eg:
使用`_`跳过某些值
~~~
const (
n1 = iota //0
n2 //1
_
n4 //3
)
~~~
`iota`声明中间插队
~~~
const (
n1 = iota //0
n2 = 100 //100
n3 = iota //2
n4 //3
)
const n5 = iota //0
~~~
多个`iota`定义在一行
~~~
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
~~~
解答:
1.const同时声明多个常量时,如果省略了值则表示和上面一行的值相同
2.每新增一行常量声明将使`iota`计数一次
3.由于没有显式的常量初始化表达式,根据const声明块的“隐式重复前一个非空表达式”机制
以上三点就可以解释c、d、e、f 的值
## 值类型和引用类型
值类型:int、float、bool 和 string等;
即`这些类型的变量直接指向存在内存中的值`
当使用等号`=`将一个变量的值赋值给另一个变量时,
eg:`j = i`,实际上是在内存中将 i 的值进行了拷贝
引用类型:特指slice、map、channel这三种预定义类型
两者的主要区别:拷贝操作和函数传参。
- Go准备工作
- 依赖管理
- Go基础
- 1、变量和常量
- 2、基本数据类型
- 3、运算符
- 4、流程控制
- 5、数组
- 数组声明和初始化
- 遍历
- 数组是值类型
- 6、切片
- 定义
- slice其他内容
- 7、map
- 8、函数
- 函数基础
- 函数进阶
- 9、指针
- 10、结构体
- 类型别名和自定义类型
- 结构体
- 11、接口
- 12、反射
- 13、并发
- 14、网络编程
- 15、单元测试
- Go常用库/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go优化
- Go问题排查
- Go框架
- 基础知识点的思考
- 面试题
- 八股文
- 操作系统
- 整理一份资料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小点
- 树
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面试题
- 基础
- Map
- Chan
- GC
- GMP
- 并发
- 内存
- 算法
- docker