变量的5种创建方式
第一种 :1行申明一个变量
var <name> <type>
其中 var 是关键字(固定不变),name 是变量名,type 是类型。
使用 var ,虽然只指定了类型,但是 Go 会对其进行隐式初始化。 如 string 类型就初始化为空字符串,int 类型就初始化为0,float 就初始化为 0.0,bool类型就初始化为false,指针类型就初始化为 nil 若想在声明并初始化,可以如下写:
var name string = "Hello world"
从右值(等号右边的值)来看,明显是个 string 类型,可以省去[type],因此也可以将其简化:
var name = "Hello world"
若右值带有小数点,在不指定类型的情况下,编译器会将变量声明为 float64,但是很多情况下,并不需要这么高的精度(精度越高,占用的内存空间更大),这种情况下,推荐指定类型,不要省略[type]
var feeRate float32 = 0.78
第二种:多个变量一起声明
声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样
var (
id int
name string
address string
)
第三种:声明和初始化一个变量
使用:=
(推导声明写法或者短类型声明法:编译器会自动根据右值类型推断出左值的对应类型。),可以声明一个变量,并对其进行(显式)初始化。
name := "Hello world"
// 等价于
var name string = ""Hello world"
// 等价于
var name = ""Hello world"
但这种方法有个限制就是,只能用于函数内部
第四种:声明和初始化多个变量
name, age := "Jack", 27
这种方法,也经常用于变量的交换
var a int = 20
var b int = 50
b, a = a, b
第五种:new 函数声明一个指针变量
变量分为两种普通变量
和指针变量
普通变量:存放的是数据本身
指针变量:存放的是数据的地址
如下代码,age 是一个普通变量,存放的内容是 27,而 page 是 存放变量age值的内存地址: 0xc00000a0c8
package main
import "fmt"
func main() {
var age int = 28
var ptr = &age // &后面接变量名,表示取出该变量的内存地址
fmt.Println("age: ", age)
fmt.Println("ptr: ", ptr)
}
输出
age: 27
page: 0xc00000a0c8
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: 0xc00000a0c8
ptr value: 0
用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。
如下两种写法,可以说是等价的
// 使用 new
func newInt() *int {
return new(int)
}
// 使用传统的方式
func newInt() *int {
var dummy int
return &dummy
}
以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。
但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示。
匿名变量,优点有三:
不分配内存,不占用内存空间
不需要你为命名无用的变量名而纠结
多次声明不会有任何问题
通常我们用匿名接收必须接收,但是又不会用到的值。
func GetData() (int, int) {
return 100, 200
}
func main(){
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}
Last updated
Was this helpful?