「GCTT 出品」Go 系列教程3. 变量

这是我们 Golang 系列教程的第 3 个教程,探讨 Golang 里的变量(Variables)。

你可以阅读 Golang 系列教程第 2 部分:Hello World,学习如何配置 Golang,并运行 hello world 程序。

变量是什么

变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。

声明单个变量

var name type 是声明单个变量的语法。

package main
import "fmt"
func main() {
 var age int // 变量声明
 fmt.Println("my age is", age)
}

在线运行程序

语句 var age int 声明了一个 int 类型的变量,名字为 age。我们还没有给该变量赋值。如果变量未被赋值,Go 会自动地将其初始化,赋值该变量类型的零值(Zero Value)。本例中 age 就被赋值为 0。如果你运行该程序,你会看到如下输出:

my age is 0

变量可以赋值为本类型的任何值。上一程序中的 age 可以赋值为任何整型值(Integer Value)。

package main
import "fmt"
func main() {
 var age int // 变量声明
 fmt.Println("my age is", age)
 age = 29 // 赋值
 fmt.Println("my age is", age)
 age = 54 // 赋值
 fmt.Println("my new age is", age)
}

在线运行程序

上面的程序会有如下输出:

my age is 0 
my age is 29 
my new age is 54

声明变量并初始化

声明变量的同时可以给定初始值。

var name type = initialvalue 的语法用于声明变量并初始化。

package main
import "fmt"
func main() {
 var age int = 29 // 声明变量并初始化

 fmt.Println("my age is", age)
}

在线运行程序

在上面的程序中,age 是具有初始值 29 的 int 类型变量。如果你运行上面的程序,你可以看见下面的输出,证实 age 已经被初始化为 29。

my age is 29

类型推断(Type Inference)

如果变量有初始值,那么 Go 能够自动推断具有初始值的变量的类型。因此,如果变量有初始值,就可以在变量声明中省略 type。

如果变量声明的语法是 var name = initialvalue,Go 能够根据初始值自动推断变量的类型。

在下面的例子中,你可以看到在第 6 行,我们省略了变量 age 的 int 类型,Go 依然推断出了它是 int 类型。

package main
import "fmt"
func main() {
 var age = 29 // 可以推断类型

 fmt.Println("my age is", age)
}

在线运行程序

声明多个变量

Go 能够通过一条语句声明多个变量。

声明多个变量的语法是 var name1, name2 type = initialvalue1, initialvalue2。

package main
import "fmt"
func main() {
 var width, height int = 100, 50 // 声明多个变量

 fmt.Println("width is", width, "height is", heigh)
}

在线运行程序

上述程序将在标准输出打印 width is 100 height is 50。

你可能已经想到,如果 width 和 height 省略了初始化,它们的初始值将赋值为 0。

package main
import "fmt"
func main() { 
 var width, height int
 fmt.Println("width is", width, "height is", height)
 width = 100
 height = 50
 fmt.Println("new width is", width, "new height is ", height)
}

在线运行程序

上面的程序将会打印:

width is 0 height is 0 
new width is 100 new height is 50

在有些情况下,我们可能会想要在一个语句中声明不同类型的变量。其语法如下:

var ( 
 name1 = initialvalue1,
 name2 = initialvalue2
)

使用上述语法,下面的程序声明不同类型的变量。

package main
import "fmt"
func main() {
 var (
 name = "naveen"
 age = 29
 height int
 )
 fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

在线运行程序

这里我们声明了 string 类型的 name、int 类型的 age 和 height(我们将会在下一教程中讨论 golang 所支持的变量类型)。运行上面的程序会产生输出 my name is naveen , age is 29 and height is 0。

简短声明

Go 也支持一种声明变量的简洁形式,称为简短声明(Short Hand Declaration),该声明使用了 := 操作符。

声明变量的简短语法是 name := initialvalue。

package main
import "fmt"
func main() { 
 name, age := "naveen", 29 // 简短声明

 fmt.Println("my name is", name, "age is", age)
}

在线运行程序

运行上面的程序,可以看到输出为 my name is naveen age is 29。

简短声明要求 := 操作符左边的所有变量都有初始值。下面程序将会抛出错误 cannot assign 1 values to 2 variables,这是因为 age 没有被赋值。

package main
import "fmt"
func main() { 
 name, age := "naveen" //error

 fmt.Println("my name is", name, "age is", age)
}

在线运行程序

简短声明的语法要求 := 操作符的左边至少有一个变量是尚未声明的。考虑下面的程序:

package main
import "fmt"
func main() {
 a, b := 20, 30 // 声明变量a和b
 fmt.Println("a is", a, "b is", b)
 b, c := 40, 50 // b已经声明,但c尚未声明
 fmt.Println("b is", b, "c is", c)
 b, c = 80, 90 // 给已经声明的变量b和c赋新值
 fmt.Println("changed b is", b, "c is", c)
}

在线运行程序

在上面程序中的第 8 行,由于 b 已经被声明,而 c 尚未声明,因此运行成功并且输出:

a is 20 b is 30 
b is 40 c is 50 
changed b is 80 c is 90

但是如果我们运行下面的程序:

package main
import "fmt"
func main() { 
 a, b := 20, 30 // 声明a和b
 fmt.Println("a is", a, "b is", b)
 a, b := 40, 50 // 错误,没有尚未声明的变量
 }

在线运行程序

上面运行后会抛出 no new variables on left side of := 的错误,这是因为 a 和 b 的变量已经声明过了,:= 的左边并没有尚未声明的变量。

变量也可以在运行时进行赋值。考虑下面的程序:

package main
import ( 
 "fmt"
 "math"
)
func main() { 
 a, b := 145.8, 543.8
 c := math.Min(a, b)
 fmt.Println("minimum value is ", c)
}

在线运行程序

在上面的程序中,c 的值是运行过程中计算得到的,即 a 和 b 的最小值。上述程序会打印:

minimum value is 145.8

由于 Go 是强类型(Strongly Typed)语言,因此不允许某一类型的变量赋值为其他类型的值。下面的程序会抛出错误 cannot use "naveen" (type string) as type int in assignment,这是因为 age 本来声明为 int 类型,而我们却尝试给它赋字符串类型的值。

package main
func main() { 
 age := 29 // age是int类型
 age = "naveen" // 错误,尝试赋值一个字符串给int类型变量
}

在线运行程序

感谢您的阅读,请在评论栏上面发布您的问题和反馈。

下一教程 - 类型

via: https://golangbot.com/variables/

作者:Nick Coghlan

译者:Noluye

校对:Unknwon

本文由 GCTT 原创编译,Go 中文网 荣誉推出

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

热门专题

易捷尔高职单招|易捷尔高职单招,易捷尔高职单招培训,单招分数线,单招录取分数线,高职单招学校分数线
易捷尔高职单招
APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业
自考本科|自考本科有用吗,自考文凭,自考本科文凭,自考文凭有用吗,自考本科文凭有用吗,自考文凭承认吗
自考本科
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部