原文链接: Go 专栏|变量和常量的申明与赋值

上篇文章介绍了环境搭建,并实现了学习 Go 的第一个程序 Hello World。这篇文章持续学习 Go 的基础知识,来看看变量,常量的申明与赋值。

本文所有代码基于 go1.16.6 编写。

变量

Go 编程的命名格调更习惯应用「短名称」和「驼峰式」的名称,而且大小写敏感。

结尾必须是字母或者下划线,而且首字母是大写还是小写也是有非凡含意的。大写字母结尾能够被包外援用,小写字母结尾只能在包内应用,这个会在当前的文章中持续分享。

申明

第一种应用关键字 var 申明变量:

var name type = expression

和 C 语言正好相同,类型是跟在变量名前面的。说实话,刚开始写 Go 代码的时候还真有些不习惯。

类型和表达式能够省略一个,但不能都省略。如果类型省略,则类型由初始化表达式决定;如果表达式省略,则初始化值为对应类型的零值。

对于数字是 0,布尔值是 false,字符串是 "",接口和援用(slice,指针,map,通道,函数)是 nil,对于数组或构造体这样的复合类型,零值是其所有元素或成员的零值。

// 没有初始值,会赋默认零值var v1 intvar v2 stringvar v3 boolvar v4 [10]int // 数组var v5 []int   // 数组切片var v6 struct {    e int}var v7 *int           // 指针var v8 map[string]int // map,key 为 string 类型,value 为 int 类型var v9 func(e int) intfmt.Println(v1, v2, v3, v4, v5, v6, v7, v8, v9)// 输入// 0  false [0 0 0 0 0 0 0 0 0 0] [] {0} <nil> map[] <nil>

所以在 Go 中是不存在未初始化的变量的。

申明单个变量:

// 申明单个变量var a = "initial"fmt.Println(a)// 申明布尔值变量var d = truefmt.Println(d)

一次申明多个变量:

// 申明多个变量var b, c int = 1, 2fmt.Println(b, c)

倡议以组形式一次申明多个变量:

// 以组的形式申明多个变量var (    b1, c1 int    b2, c2 = 3, 4)fmt.Println(b1, c1)fmt.Println(b2, c2)

第二种形式是短变量申明:

name := expression

应用 := 来申明,Go 编译器会主动推断变量类型。留神 :== 的区别,前者是申明并赋值,后者是赋值。

这种初始化形式十分不便,在局部变量的申明和初始化时常常应用。

举个例子:

// 短变量申明形式f := "short"fmt.Println(f)

多个变量:

// 申明赋值多个变量g, h := 5, "alwaysbeta"fmt.Println(g, h)

有一点须要留神,多个变量申明时,起码有一个新变量,否则会报错。

var i int// i := 100 // 报错 no new variables on left side of :=i, j := 100, 101 // 有新值 j,不报错fmt.Println(i, j)

第三种应用内置 new 函数:

p := new(T)

初始化为类型 T 的零值,并返回其地址。

先说一下如何获取变量的地址,其实很简略,应用取地址符 & 即可。

申明一个整型的变量,而后对其取地址:

// 指针k := 6l := &k         // l 为整型指针,指向 kfmt.Println(*l) // 输入 6*l = 7fmt.Println(k) // 输入 7

应用 new 函数申明变量:

// 应用内置函数 new 申明var p = new(int)fmt.Println(*p) // 输入整型默认值 0*p = 8fmt.Println(*p) // 输入 8

再来看一个例子,上面两个函数是等价的,惟一的区别就是应用 new 少申明了一个两头变量。

func newInt() *int {    return new(int)}func newInt1() *int {    var p int    return &p}

赋值

应用 = 来赋值:

举例:

// 变量赋值var m, n intm = 9n = 10fmt.Println(m, n)

多重赋值:

// 变量赋值var m, n intm = 9n = 10m, n = n, mfmt.Println(m, n)

这个个性真是很爽,想想在 C 语言中是不能这么做的,要实现雷同的成果,必须要借助一个两头变量才行。

如果有不须要的变量,应用空标识符 _ 来疏忽,在 Go 语言中,如果申明了变量而不应用,程序是会报错的。

// 空标识符r := [5]int{1, 2, 3, 4, 5}for _, v := range r {    // fmt.Println(i, v)    // fmt.Println(v)    // 定义 i 但不必会报错 i declared but not used    fmt.Println(v) // 疏忽索引}

作用域

变量分为全局变量和局部变量,局部变量会笼罩全局变量:

// 全局变量var gg = "global"func main() {    // 作用域    fmt.Println(gg) // 输入 global    gg = "local"    fmt.Println(gg) // 输入 local}

应用流程管制语句时,须要非凡留神变量的作用域:

// 条件分支下的作用域if f, err := os.Open("./00_hello.go"); err != nil {    fmt.Println(err)}f.Close()    // 报错 f.Close undefined (type string has no field or method Close)

正确的写法:

// 正确写法file, err := os.Open("00_hello.go")if err != nil {    fmt.Println(err)}file.Close()

常量

常量示意在程序运行过程中恒定不变的值。

申明

应用关键字 const 来申明,语法和变量相似。

个别在给常量起名的时候,会起一个有明确含意的名字。

const Pi float64 = 3.14159265358979323846

申明单个常量:

// 无类型整型常量const n = 500000000// 用编译阶段即可计算出值的表达式来赋值const d = 3e20 / nfmt.Println(d)// 无类型浮点常量const zero = 0.0

申明多个常量

// 无类型整型和字符串常量const a, b, c = 3, 4, "foo"fmt.Println(a, b, c)// 多个常量const (    size int64 = 1024    eof        = -1 // 无类型整型常量)fmt.Println(size, eof)

iota

常量申明还有能够应用常量生成器 iota,它不会显示写出常量的值,而是从 0 开始,逐项加 1。

// 从 0 值开始,逐项加 1const (    a0 = iota // 0    a1 = iota // 1    a2 = iota // 2)fmt.Println(a0, a1, a2)// 简写,表达式雷同,能够省略前面的const (    b0 = iota // 0    b1        // 1    b2        // 2)fmt.Println(b0, b1, b2)const (    b         = iota      // 0    c float32 = iota * 10 // 10    d         = iota      // 2)fmt.Println(b, c, d)

iota 在每个 const 结尾被重置为 0。

// iota 在每个 const 结尾被重置为 0const x = iota // 0fmt.Println(x)// 同上const y = iota // 0fmt.Println(y)

还能够用来作为枚举类型,比方一周 7 天,每天用一个数字示意,那么能够这么申明:

// 枚举const (    Sunday    = iota // 0    Monday           // 1    Tuesday          // 2    Wednesday        // 3    Thursday         // 4    Friday           // 5    Saturday         // 6)fmt.Println(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)

总结

本文次要介绍了变量和常量的申明和赋值,变量申明次要有三种形式:

  1. 应用关键字 var 来申明;
  2. 应用 := 的短变量申明形式;
  3. 应用内置函数 new

其中短变量形式在申明局部变量时常常应用,而且还要留神不要和赋值 = 弄混。

常量申明和变量相似,只须要把 var 换成 const 即可。

常量还有一种非凡的申明形式,应用 iota。它不会显示写出常量的值,而是从 0 开始,逐项加 1。

变量的作用域分为全局变量和局部变量,局部变量能够笼罩全局变量,应用时须要留神。


文章中的脑图和源码都上传到了 GitHub,有须要的同学可自行下载。

地址: https://github.com/yongxinz/g...

关注公众号 AlwaysBeta,回复「goebook」支付 Go 编程经典书籍。

Go 专栏文章列表:

  1. 开发环境搭建以及开发工具 VS Code 配置