Go 语言作为静态类型语言。由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。
变量声明之后才可以使用 。
声明变量(关键字 var
)一般有以下五种方法,其中前两种同样也可用于定义常量(关键字 const
)
一:一行声明一个变量
var <name> <type>
其中 var 是声明变量关键字,name 是变量名,type 是类型。
使用 var ,虽然只指定了类型,但是 Go 会对其进行隐式初始化,比如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil。
若想在声明过程,顺便也初始化,可以这样写:
var name string = "Edemao 博客"
在 Go 文件中的完整代码如下,为了不写重复性的代码,后续只展示关键代码:
package main
import "fmt"
func main() {
var name string = "Edemao 博客"
fmt.Println(name)
}
在 Go 中一定要使用双引号,表示字符串,而在单引号表示rune 类型的字符,因此也可以将其简化为:
var name = "Edemao 博客"
若右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为 float64,在精度要求不高情况下考虑内存空间,推荐指定类型:
var rate float32 = 0.89
二:多个变量一起声明
声明多个变量,一是可以按照第一种方法写成多行,此外还可以使用小括号:
var (
name string
age int
sex string
)
三:声明和初始化一个变量
使用 :=
(推导声明写法或短类型声明法),编译器会自动根据右值类型推断出左值的对应类型。对变量进行声明和(显式)初始化:
name := "Edemao 博客"
// 等价于
var name string = "Edemao 博客"
// 等价于
var name = "Edemao 博客"
此方法只能用于函数内部
四:声明和初始化多个变量
name, age := "Edemao 博客", 24
//同时支持变量交换
var a int = 100
var b int = 200
b, a = a, b
五:new 函数创建指针变量
变量分为两种 普通变量
和 指针变量
。其中普通变量,存放的是数据本身,而指针变量存放的是数据的地址。比如:
//age 是一个普通变量,存放的内容是24,而 ptr 是 存放变量age值的内存地址:0xc000010098
package main
import "fmt"
func main() {
var age int = 24
var ptr = &age // &后面接变量名,表示取出该变量的内存地址
fmt.Println("age: ", age)
fmt.Println("ptr: ", ptr)
}
/*输出
age: 28
ptr: 0xc000010098
*/
new 函数,是 Go 里的一个内建函数。使用表达式 new(Type) 将创建一个 Type 类型的匿名变量,初始化为Type 类型的零值,然后返回存储该变量地址的指针(指针类型为*Type
)。
package main
import "fmt"
func main() {
ptr := new(int)
fmt.Println("ptr address: ", ptr)
fmt.Println("ptr value: ", *ptr) // * 后面接指针变量,表示从内存地址中取值
}
/*
输出:
ptr address: 0xc000010098
ptr value: 0
*/
用new创建变量和普通变量声明语句方式创建变量其实无区别,只是可以不需要声明一个临时变量的名字和可以在表达式中使用new(Type)。简言之,new函数类似语法糖。以下两种方式等价:
/ 使用 new(type)
func newInt() *int {
return new(int)
}
// 使用传统的方式
func newInt() *int {
var dummy int
return &dummy
}
对于Go语言,变量/常量都只能声明一次,声明多次,编译就会报错。
但也有例外,这就要说到一个特殊变量:匿名变量 (下划线 '_'),也称作占位符,或者空白标识符。
匿名变量,优点有三:
-
不分配内存,不占用内存空间
-
不需要你为命名无用的变量名而纠结
-
多次声明不会有任何问题
通常我们用匿名变量来接收必须接收,但是又不会用到的值,就像这样:
func getData() (int, int) {
return 100, 200
}
func main(){
a, _ := getData()
_, b := getData()
fmt.Println(a, b)
}