企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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`计数一次 以上两点就可以解释c、d、e、f 的值 ## 值类型和引用类型 值类型:int、float、bool 和 string等; 即`这些类型的变量直接指向存在内存中的值` 当使用等号`=`将一个变量的值赋值给另一个变量时, eg:`j = i`,实际上是在内存中将 i 的值进行了拷贝 引用类型:特指slice、map、channel这三种预定义类型 两者的主要区别:拷贝操作和函数传参。