Go语言变量
Go语言变量
参考资料主要来源于菜鸟教程。
参考链接:https://blog.51cto.com/u_15230485/2821028
变量来源于数学,是计算机语言中能存储计算结果或能表示值抽象概念。
变量可以通过变量名访问。
Go语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用var关键字:
var identifier type
可以一次声明多个变量:
var identifier1, identifier2 type
package main
import "fmt"
func main() {
//test.New() //包信息
//fmt.Println("main")
//var stockcode = 123
//var enddate = "2020-12-31"
//var url = "Code= %d & endDate = %s"
//fmt.Printf(url,stockcode,enddate)
var a string = "test"
fmt.Println(a)
var b,c int = 1, 2
fmt.Println(b,c)
}
输出结果:
test
1 2
变量声明
第一种,指定变量类型,如果没有初始化,则变量默认为零值。
var name type
name = value
零值就是变量没有做初始化时系统默认设置的值。
package main
import "fmt"
func main() {
var a = "test"
fmt.Println(a)
var b int
fmt.Println(b)
var c bool
fmt.Println(c)
}
输出结果:
test
0
false
-
数值类型(包括complex64/128)为0
-
布尔类型为false
-
字符串为""(空字符串)
-
以下几种类型为nil:
var a *int var a []int var a map[string] int var a chan int var a func(string) int var a error //error 是接口
实例:
package main
import "fmt"
func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf("%v %v %v %q\n",i,f,b,s)
}
输出结果是:
0 0 false ""
第二种,本剧值自行判定变量类型。
var name = value
实例:
package main
import "fmt"
func main() {
var d = true
fmt.Println(d)
}
输出结果:
true
第三种,如果变量已经使用var声明过了,再使用:=声明变量,就会产生编译错误。
TIPS:这种不带声明格式的只能在函数体中出现
name := value
例如:
var intVal int
intVal := 1 //这时会产生编译错误,因为intVal已经声明,不需要重新声明
将上述改成如下语句即可:
intVal := 1 //此时不会产生编译错误,因为有声明新的变量,:=是一个声明语句
intVal := 1
相当于:
var intVal int
intVal = 1
即可以将var f string = ”test"简写为 f := “test”。
多变量声明
//类型相同的多个变量,非全局变量
var name1,name2,name3 type
name1,name2,name3 = v1,v2,v3
var name1,name2,name3 = v1,v2,v3 //和python很像,不需要显式声明类型,否则会导致编译错误
name1,name2,name3 := v1,v2,v3 //出现:=左侧的变量不应该是已经被声明过的,否则会导致编译错误
//这种因式分解的写法一般用于声明全局变量
var (
name1 type
name2 type
)
实例:
package main
import "fmt"
var x,y int
var (
a int
b bool
)
var c,d int = 1,2
var e,f = 123, "hello"
func main() {
g,h := 123,"world"
fmt.Println(x, y, a, b, c, d, e, f, g, h)
}
输出结果:
0 0 0 false 1 2 123 hello 123 world
值类型和引用类型
与C/C++类似。
- 值类型:基本数据类型 int 系列, float 系列, bool, string 、数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值通常存储在栈中。
- 引用类型:指针、slice切片、map、管道chan、interface 等都是引用类型
栈和堆
在内存中分成两大块:栈和堆。值类型的变量通常存储在栈区,引用类型通常存储在堆区。在Go中,有可能值类型也存储在堆区,反过来也有可能引用类型存储在栈区。
简短形式,使用:=赋值操作符
我们知道可以在变量的初始化时省略变量的类型而由系统自动判断,声明语句写上var关键字其实是显得有些多余,因此我们可以将它们简写为a:=50或者b:=false。
a和b的类型(int和bool)将由编译器自动推断。
这是使用变量的首选形式,但是它只能被用在函数内,而不可以用于全局变量的声明与赋值。使用操作符:=可以高效地创建一个新的变量,称之为初始化声明。
注意事项
如果在相同的代码块中,不可以再次对相同名称的变量使用初始化声明,例如:a:=20就不被允许使用,编译器会提示错误,但是a=20可以,这相当于给相同的变量赋予一个新的值。
如果在定义变量a之前使用它,会得到一个编译错误。
如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误。
但是全局变量是允许声明但不使用的。同一类型的多个变量可以声明在同一行,如:
var a, b, c int
多变量也可以在用一行进行赋值,如:
var a, b int
var c string
a, b, c = 5, 7, "abc"
上面这行假设变量a,b和c都已经被声明,否则的话应该这样使用:
a, b, c := 5, 7, "abc"
右边的这些以享用的顺序赋值给左边的变量,所以a的值是5,b的值是7,c的值是“abc”。
这被称为并行
或同时
赋值。
如果发你想要交换两个变量的值,则可以简单地使用a,b = b,a
,两个变量的类型必须是相同。
空白标识符_
也被用于抛弃值,如值5在:_ , b = 5, 7中被抛弃。
_
实际上一个只写变量,不能得到它的值,这样做是因为Go语言中必须使用所有被声明的变量,但有时候并不需要使用从一个函数得到的所有返回值。
并行赋值也别用于当一个函数返回多个返回值是,比如这里的val和错误err是通过调用Func1 函数同时得到的:val, err = Fun1(var1)。
空白标识符在函数返回时的使用
package main
import "fmt"
func numbers()(int,int,string){
a,b,c := 1,2,"str"
return a,b,c
}
func main() {
_,num,strs := numbers()
fmt.Println(num,strs)
}
输出结果:
2 str