专栏首页aoho求索Go 语言入门系列:基本语法介绍之变量的声明与初始化

Go 语言入门系列:基本语法介绍之变量的声明与初始化

各位同学端午安康!

前文回顾

前面的文章介绍了 Go 相关的特性与入门案例,对于一门编程语言,变量和语法是我们首先需要掌握的。Go 在语法上与 C 语言有很多相似支持,但是比 C 语言更加简约。如果你有一定的 C 语言基础,阅读起来就事半功倍,即时没有也没关系,因为 Go 的语法非常易于理解。

本系列文章将会介绍 Go 语言基础语法的相关知识,本文将首先从变量的声明与初始化讲起。

变量的声明与初始化

在 HelloGo 中,我们已经声明了不少的变量,样式如下所示:

var input string

上述代码中声明了一个 string 类型,变量名为 input 的变量。Golang 在声明变量时,会自动把变量对应的内存区域进行初始化操作,每个变量会被初始化为其类型的默认值。变量声明样式如下所示:

var name T

一些常见的变量的声明样式如下:

var a int //声明一个 int 类型的变量
var b string //声明一个 string 类型的变量
var c []float //声明一个 float 类型的切片
var d struct{ // 声明一个匿名结构体,该结构体有一个 int 类型的字段
 x int
}
var e func() bool //声明一个函数变量

var (
 f int
 g string
)
// 同时声明多组变量

❝在 Golang 中,每一个声明的变量都必须被使用,否则会编译不通过。 ❞

对变量进行声明之后,我们还需要对变量空白的内存区域进行初始化,也就是赋值。与其他的语言一致,通过 = 赋值符号初始化,如下例子:

var a int = 100

上述代码中,声明了一个 int 类型的 a 变量,并将其赋值为 100。变量初始化的样式为:

var name T = 表达式

当然可以利用 Golang 提供的类型推导语法糖特性,精简为以下的样式:

var a = 100
b := "Hello"

在省略了类型属性后,编译器会尝试根据等号右边的表达式推导出变量的类型。注意在使用 := 短变量声明初始化时,左值中的变量最少有一个变量必须是未定义过的变量,否则会出现编译错误。同时 := 不能出现在全局变量的声明和初始化中。

var a = 100
a := 100 //编译报错
a, b := 100, "OK" //无异常

在上述代码中,a := 100 会在编译过程中抛出 no new variables on left side of := 的报错;而 a, b := 100 不会。

我们可以尝试运行 Variable 中的代码,看一下编译器的类型推导结果。

// Variable.go
package main

import "fmt"

func main()  {

 var a int = 100
 var b = "100"
 c := 0.17

 fmt.Printf("a value is %v, type is %T\n", a, a)
 fmt.Printf("b value is %v, type is %T\n", b, b)
 fmt.Printf("c value is %v, type is %T\n", c, c)

}

输出结果如下:

a value is 100, type is int
b value is 100, type is string
c value is 0.17, type is float64

从上述表示结果可以看到,变量都被赋予了正确的变量类型。需要注意的是,为了提供精度,浮点数类型会被默认推导为 float64

与 C 语言相比,除了类型推导的语法糖特性,Golang 还提供了多重赋值和匿名变量的语法糖特性。

在过去的编程语言中,如果我们想要交换变量的值,就需要借助一个第三方临时变量来实现,如下例子所示:

var a int = 1
var b int = 2
var tmp int

tmp = a
a = b
b = tmp

在 Golang 中,我们可以通过多重赋值的特性轻松实现类似的变量交换任务,如下所示:

var a int = 1
var b int = 2

b, a = a, b

在多重赋值的过程中,变量的左值和右值按照从左往右的顺序赋值。

在 Golang 中,被声明的变量必须被使用,否则会被编译器抛出异常。Golang 支持函数多返回值和上面所说的多重赋值,但是有些时候我们不需要使用某些左值,可以使用匿名变量处理,具体例子如 Anonymous.go 所示:

package main
import "fmt"

// 返回一个人的姓和名
func getName() (string, string){
 return "王", "小二"
}

func main()  {
 surname, _ := getName()
 _, personalName := getName()

 fmt.Printf("My surname is %v and my personal name is %v", surname, personalName)
}

通过在不需要的变量声明的地方使用 _ 代替变量名,我们就可以忽略部分不需要的左值。匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。

小结

变量一般是指程序运行过程中存储数据的抽象概念,它的值是允许改变的;与之相对的是常量,它的值在程序运行过程中是不允许变化的。下面的文章,我们将会介绍 Go 语言的原生数据类型。

本文分享自微信公众号 - aoho求索(aohoBlog),作者:cangwu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go 语言基础入门教程 —— 变量声明、初始化、赋值和作用域

    变量是几乎所有编程语言中最基本的组成元素。从本质上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量...

    学院君
  • 夯实基础:Go 语言匿名函数和闭包的应用实践

    前面的文章主要介绍了 Go 语言中函数声明和参数传递。本文将会继续介绍匿名函数和闭包相关的概念以及使用方法。

    aoho求索
  • Go 语言面向对象教程 —— 类的定义、初始化和成员方法

    上篇教程我们简单给大家介绍了 Go 语言的类型系统,关于基础类型、复合类型以及值语义和引用语义我们前 面在数据类型系列里面已经基本都介绍过了,接下来,我们就与 ...

    学院君
  • 一起来学Go --- (go的变量)

    变量是几乎所有编程语言中最基本的组成元素,从根本上说,变量相当于是一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名...

    Wyc
  • Go 语言入门系列:数组的使用

    前面的文章主要介绍了 Go 基于语法中的分支和循环控制结构。其中涉及到的 If 、Switch 和 for 等关键字,是我们日常编码所常用的。当我们在程序中操作...

    aoho求索
  • 夯实基础:Go 语言包依赖管理

    在前面系列文章中,我们对 Go 的基础语法和一些简单的特性进行介绍,如数据类型、容器等。本文开始,我们将对 Go 中的一些高级特性进行介绍,包括包管理、反射、并...

    aoho求索
  • Go 语言基础入门教程 —— Go 项目基本工程管理示例

    在上一篇教程中,学院君带着大家搭建起了本地开发环境,并且编写了第一个 Go 程序,向世界问好。不过在实际开发过程中,直接调用编译器进行编译和链接(调用 go b...

    学院君
  • 夯实基础:Go 语言函数声明和参数传递

    前面的文章主要介绍了 Go 语言中提供的常用容器,包括数组、切片,列表和字典等,还介绍了这些容器的遍历方法。本文开始将会介绍 Go 语言中相关的函数和接口。

    aoho求索
  • go 学习笔记之有意思的变量和不安分的常量

    首先希望学习 Go 语言的爱好者至少拥有其他语言的编程经验,如果是完全零基础的小白用户,本教程可能并不适合阅读或尝试阅读看看,系列笔记的目标是站在其他语言的角度...

    雪之梦技术驿站
  • Go 语言入门系列:Go 语言中的常量别名与控制结构

    前面一篇文章主要介绍了 Go 语言中的指针基本概念与相关用法。Go 语言限制了指针类型的偏移和运算能力,使得指针类型具备了指针高效访问的特性,但又不会发生指针偏...

    aoho求索
  • 【Go语言基础】变量和常量

    用Go语言编写的程序都是从基本组件构成,而构成这些基本组件的是标识符,本章中将介绍到Go语言中使用到变量,常量以及基本数据类型。

    zhaozhiyong
  • 【Golang】基础入门 Hello World

    我大概是2013年7月开始接触Go语言的,被大学同学安利(感谢@slowfei),尝试了解之后然后就被这不按常理出牌的语法、逻辑、关键字和诡异的格式化时间格式深...

    林小帅
  • go语言数值类型及布尔类型

    常量声明常量是程序在编译时就确定的值,程序在执行时不能修改常量的值。声明常量使用关键字const。在声明常量时,需要对常量赋值。const 名称 类型 = 值 ...

    暮雨
  • ​go语言数值类型及布尔类型

    常量是程序在编译时就确定的值,程序在执行时不能修改常量的值。声明常量使用关键字const。在声明常量时,需要对常量赋值。

    暮雨
  • 掌握一门语言Go

    摘要:Go语言的优势不必多说,通过本篇文章,让我们花时间来掌握一门外语,Let's Go! 关键字:Go语言,闭包,基本语法,函数与方法,指针,slic...

    文彬
  • Go语言入门——基础语法篇(二)

    Go的语句是可以省略;结束符的,且每行尽可能只写一句代码,这是Go语言的编程范式,因此应遵循规范,不要加分号。分号只在一种情况下是必须的,当一行写了多个代码语句...

    arcticfox
  • Go语言入门系列(四)之map的使用

    map是一种映射,可以将键(key)映射到值(value),格式为:map[keyType]valueType。

    二十二画程序员
  • Go语言入门——数组、切片和映射

    但是对于Go,思来想去,感觉真的从“HelloWorld”说起,压根撑不住一篇的篇幅,因为Go的HelloWorld太简单了。

    JackieZheng
  • Go语言入门

    Go语言相对比较简单,与C语言有点像,所以在有C基础的情况下,再学习下Go的特性,基本就懂得怎么写了,学起来不会像Scala那么痛苦,太多的特性及语法糖。Go奉...

    潇洒哥和黑大帅

扫码关注云+社区

领取腾讯云代金券