go语言变量与常量

变量:

变量是计算机语言中能储存特定类型计算结果或能表示特定类型值的抽象概念

声明变量及变量赋值:

go语言中声明变量有多种方法,声明单个变量最基本语法如下:

var 变量名称 变量类型

例如:

var a int//声明一个int类型的变量

以上的代码声明了一个int类型的变量a,但是没有给变量a赋值,go会自动给变量初始化,会给变量a赋值int类型的零值0,使用=可以给变量赋值

package main
import "fmt"
func main() {
    var a int
    fmt.Println(a)//会输出0
}

在声明变量时也可以不指定变量类型,当声明变量时同时给变量初始化,go语言可以自动推断具有初始值的变量类型

var a = 12//自动推断出变量a的类型为int

go中声明变量还有一种简便写法,使用:=声明变量,该方式只能出现在函数体中,语法如下

变量名称:=变量值

该简便写法要求:=左边的变量必须有初始值,而且左边的变量必须有未声明的变量

package main
import "fmt"
func main() {
    var b
    a := 12//简便方式声明变量并进行初始化
    b := 1//变量b已经声明过,所以此处会报错 no new variables on left side of :=
    fmt.Println(a,b)
}

go语言中可以通过一条语句声明多个变量,语法如下:

var 变量1,变量2... 变量类型

通过这种方法声明的变量,指定了变量类型,所以声明的变量都是同一种类型。省略变量类型并给变量进行初始化,可以通过go的自动推断变量的类型

package main
import "fmt"
func main() {
    var a,b int = 1,2//同时声明了两个int类型的变量并进行初始化
    fmt.Println(a,b)
    var aa,bb = "12aaa",5//同时声明了两个变量,变量aa类型为string,变量bb类型为int
    fmt.Println(aa,bb)
}

使用:=的简便方法也可以一次声明多个变量,简便方法声明多个变量必须进行初始化,并且左边的变量至少有一个是未声明的变量

package main
import "fmt"
func main() {
    a,b := 1,"b"//同时声明了两个变量并进行初始化
    fmt.Println(a,b)//输出1 b
    
    //同时声明了三个个变量,变量cc未初始化会报错assignment mismatch: 3 variable but 2 values
    //aa,bb,cc := "12aaa",5
    
    a,b,c := 2,"bb",4//可以运行,虽然变量a和b是已经声明过的变量,但是变量c是未声明的变量,要注意已经声明过的变量类型不能改变
    fmt.Println(a,b,c)//输出2 bb 4
}

go中还有另一种一次声明多个变量的方法,并且可以声明不同类型的变量,这种方法多用于声明全局变量

package main
import "fmt"
//该方式中如果不给变量初始化需要指定变量类型,该方式中不能用简便写法:=
var(
    a = 1
    b string = "b"
    c int
    d = true
)

func main() {
    fmt.Println(a,b,c,d)
}

特殊变量"_":
go语言中,下划线是一个特殊的变量也称作空白标识符(匿名变量),代表忽略的变量。匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用

package main
import "fmt"
func main() {
    //调用test()函数,最后一个返回值忽略掉
    a,b,_ := test()
    fmt.Println(a,b)//输出1 true
}

//返回三个不同类型返回值的函数
func test()(int,bool,string){
    a,b,c := 1,true,"c"
    return a,b,c
}

变量的可见性规则:
大写字母开头的变量是公有变量;
小写字母开头的变量是私有变量;

常量:

常量一般用于表示固定的值,并且在程序运行时,是不会被修改的量
常量存储的位置在数据区,常量不能使用&获取地址访问;变量存储于栈区,栈区,系统为每一个应用程序分配1M空间存变量,程序运行结束后自动释放

声明常量及常量赋值:

go中常量的数据类型只能是布尔型、数字型(整数型、浮点型和复数)和字符串型,常量的声明格式如下

const 常量名 常量类型 = 常量值//该方式称为常量的显示定义
或
const 常量名 = 常量值//该方式称为常量的隐式定义

常量的声明也可以一行语句声明多个统一类型常量

const 常量1,常量2... 常量类型 = 常量1的值,常量2的值
或
const 常量1,常量2 = 常量1的值,常量2的值

一次性生成多个不同类型常量语法如下

const(
  常量1 常量类型 = 常量值
  常量2 常量类型 = 常量值
  ...
)

常量在声明后无法重新给常量赋值,会报错cannot assign to xxx

package main
import "fmt"
func main() {
    const a = 6
    a = 7//常量不能重新赋值,报错cannot assign to a
    fmt.Println(a)
}
特殊常量iota:

iota是一个特殊的常量,可以认为是一个可以被编译器修改的常量,只能在常量中使用,不能在函数体中使用;iota相当于枚举,多用于生成一组相似规则初始化的常量;iota在const关键字出现时将被重置为0(const内部的第一行之前);const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引);

package main
import "fmt"
const (
    a = iota//此时a的值为iota的默认值0
    //每当iota在新的一行使用时,值都会加1
    b = iota
    c = iota
)
const d = iota//iota在const关键字出现时将被重置为0
func main() {
    fmt.Println(a,b,c,d)//输出0 1 2 0
    
}

在const总iota每增一行值就加1,不管两个iota中间是否有其他不是iota的常量

package main
import "fmt"
const (
    a = iota//此时a的值为iota的默认值0
    _//匿名变量,忽略该变量
    b = "bbb"
    c = iota//未有新的const关键字,iota在新的一行使用时,值都会加1,所以c的值为3
)
func main() {
    fmt.Println(a,b,c)//输出0 bbb 3
}

定义iota常量时,写在同一行的值相同,换行的值加一

package main
import "fmt"
func main(){
    const(
        a=iota
        b,c=iota,iota//定义iota常量时,写在同一行的值相同,换行的值加一
        d,e
    )
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
    fmt.Println(e)
}

iota常用法:
1.跳值使用法:

package main
import "fmt"
const (
    a = iota//此时a的值为iota的默认值0
    _//匿名变量,忽略该变量
    b = iota//未有新的const关键字,iota在新的一行使用时,值都会加1,所以b的值为2
)
func main() {
    fmt.Println(a,b)//输出0 2
}

2.插队使用法

package main
import "fmt"
const (
    a = iota//此时a的值为iota的默认值0
    //iota不管两个iota中间是否有其他不是iota的常量
    b = "bbb"
    c = iota//未有新的const关键字,iota在新的一行使用时,值都会加1,所以c的值为2
)
func main() {
    fmt.Println(a,b,c)//0 bbb 2
}

3.表达式隐式使用法
package main
import "fmt"
const (
a = iota//a=0
b//b=1
c//c=2
)
const (
aa = iota + 1//iota默认值为0,aa=0+1
bb//默认使用上一行表达式,并且iota遇到新的一行加1,bb=1+1
cc = iota//新的一行,iota加1,cc=2
dd
)
func main() {
fmt.Println(a,b,c)//输出0 1 2
fmt.Println(aa,bb,cc,dd)//1 2 2 3
}
4.单行使用法
使用默认上一行表达式,需要与上一行格式对应,例如上一行如果是声明两个常量,下一行也需要声明两个,这样才能默认使用上一行表达式,否则会报错extra expression in const declaration

package main
import "fmt"
const (
    a,b = iota,iota + 1//同属于一行,iota不增加,a=0,b=1
    c,d//默认使用上一行表达式,iota加1,c=1,d=1+1
    e = iota//e=2,前面都是多个常量,此时如果声明一个常量需要显式赋值,因为无法应用默认上一行表达式,会报错
)
func main() {
    fmt.Println(a,b,c,d,e)//输出0 1 1 2 2
}

5.生成枚举值
go语言中没有枚举,可以使用iota模拟枚举

package main
import "fmt"
//模拟枚举
const (
    turnRight = iota//生成枚举值,iota默认值为0
    turnLeft
    goStraight
)
func main() {
    fmt.Print("右转:")
    fmt.Println(turnRight)
    fmt.Print("左转:")
    fmt.Println(turnLeft)
    fmt.Print("直行:")
    fmt.Println(goStraight)
    /*
    输出
    右转:0
    左转:1
    直行:2
    */
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容