前言:本文主要介绍常量和变量的使用,以及关于变量的可见性规则、引用类型和值类型的区别。
一、常量
常量表达式的值在编译期计算,而不是在运行期。常量的值不可修改,这样可以防止在运行期被意外或恶意的修改。
1.1 常量的声明
常量的定义格式:
const identifier [type] = value
显式定义常量:
const a string = "Tom"
隐式定义常量:(这里用了类型推导)
const a = "Tom"
多个相同类型常量定义:
const first_name, last_name = "T", "om"
示例:
package main
import (
"fmt"
)
const first_name, last_name = "T", "om"
func main() {
fmt.Printf("My name is :%s%s",first_name,last_name)
}
运行结果:
My name is :Tom
1.2 常量表达式的继承
示例:
package main
import (
"fmt"
)
const (
a = iota
b
c = iota
d
e
)
const (
f = iota
)
func main() {
fmt.Printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d",a,b,c,d,e,f)
}
结果:
a = 0
b = 1
c = 2
d = 3
e = 4
f = 0
二、变量
变量是有明确类型的。编译器会检查函数调用中,变量类型的正确性。
2.1 变量的声明
变量声明的表达式:
var 变量名字 类型 = 表达式
常规变量声明:
var Name string
Name = "Tom"
变量的类型推导:
var Age = 27
变量的省略调用:
Sex := "男"
2.2 多变量的声明
示例:
package main
import "fmt"
var Name string
//多个变量的声明
var Job,Mail = "DBA","1234568@qq.com"
var (
Son_Name = "HB"
Son_Age = 1
Son_sex = "男"
)
func main() {
Name = "Tom"
var Age = 27
Sex := "男"
fmt.Printf("My name is %s;My age is %d;My sex is %v;My job is %v;My e-mail is %v\n",Name,Age,Sex,Job,Mail)
fmt.Printf("My son name is %s;My son age is %d;My son sex is %v",Son_Name,Son_Age,Son_sex)
}
结果:
My name is Tom;My age is 27;My sex is 男;My job is DBA;My e-mail is 1234568@qq.com
My son name is HB;My son age is 1;My son sex is 男
2.3 变量的生命周期
变量的生命周期指的是在程序运行期间变量有效存在的时间间隔。
包变量(全局变量):对于包变量来说,它们的生命周期和整个程序的运行周期是一致的,一个全局变量可以声明后在整个程序中使用。
局部变量:在函数或块中声明的变量,它们只能由在函数或代码块中的语句使用。局部变量对于它们自己以外的函数是未知的。函数的参数变量和返回值变量都是局部变量。它们在函数每次被调用的时候创建。
示例:
package main
import "fmt"
var Name = "Tom"
func main() {
Name = "tom"
fmt.Printf("My name is %s",Name)
}
结果:
My name is tom
在程序中,局部变量和全局变量的名称可以相同,但函数内部的局部变量的值将优先(也就是说局部变量会覆盖全局变量)。
三、数组
数组是一个具有相同数据类型的元素组成的固定长度的有序集合。同类型的两个数组([5]string和[10]string是两个完全不同的数组)支持"=="和"!="比较,但是不能比较大小。数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。
一维数组的声明方式:
var variable_name [SIZE] variable_type
多维数组的声明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
示例:
package main
import "fmt"
func shuzu(x [5]int) {
var i,j int
for i = 0; i < 5; i++ {
x[i] = x[i] +10
}
for j = 0; j < 5; j++ {
fmt.Printf("数组传参:Element[%d] = %d\n", j, x[j] )
}
}
func main() {
//一维数组
m := [5]int{3,4,5,6,7}
n := [5]int{3,4,5,6,7}
fmt.Printf("数组比较:m = n is %v\n\n",m == n)
shuzu(m)
var a [10]int
var i,j int
for i=0;i < 10 ; i++ {
a[i] = i+10
}
for j = 0; j < 10; j++ {
fmt.Printf("数组赋值:Element[%d] = %d\n", j, a[j] )
}
//一个三行四列的二维数组
b := [3][4]int{{0, 1, 2, 3} , {1, 2, 3, 4} , {2, 3, 4, 5}}
for i = 0; i < 3; i++ {
for j = 0; j < 4; j++ {
fmt.Printf("多维数组:b[%d][%d] = %d\n",i,j,b[i][j])
}
}
}
结果:
数组比较:m = n is true
数组传参:Element[0] = 13
数组传参:Element[1] = 14
数组传参:Element[2] = 15
数组传参:Element[3] = 16
数组传参:Element[4] = 17
数组赋值:Element[0] = 10
数组赋值:Element[1] = 11
数组赋值:Element[2] = 12
数组赋值:Element[3] = 13
数组赋值:Element[4] = 14
数组赋值:Element[5] = 15
数组赋值:Element[6] = 16
数组赋值:Element[7] = 17
数组赋值:Element[8] = 18
数组赋值:Element[9] = 19
多维数组:b[0][0] = 0
多维数组:b[0][1] = 1
多维数组:b[0][2] = 2
多维数组:b[0][3] = 3
多维数组:b[1][0] = 1
多维数组:b[1][1] = 2
多维数组:b[1][2] = 3
多维数组:b[1][3] = 4
多维数组:b[2][0] = 2
多维数组:b[2][1] = 3
多维数组:b[2][2] = 4
多维数组:b[2][3] = 5
为了方便大家交流,本人开通了微信公众号(关注看更多精彩)和QQ群,QQ群1(291519319)和QQ群2(659336691)。喜欢技术的一起来交流吧
有疑问加站长微信联系(非本文作者)