变量是任何一门编程语言的基础,每一门语言的变量定义风格也不尽相同,我们来看看 Go 语言定义变量的方式。

全局变量

Go 语言中使用 var 关键字定义全局变量,格式为:

var variableName type = value

// 注意同 C 和 Java 不一样的是,Go 语言把变量类型放在了变量名的后面 
var a int  = 1 

// 并行定义多个全局变量
var a, b, c int = 1, 2, 3 

// 具有初始值的变量定义可以省略类型
var a, b, c = 1, 2, 3

// 全局变量可以使用简写
var (
    a = "hello"
    b = true
    c = 3
    // a, b, c = 1, 2, 3
)

局部变量

在方法体内,我们可以把 var 关键字省略,变成 := 形式,它表示变量的「自动类型推导 + 赋值」

package main

import "fmt"

func main() {
    a := 1
    fmt.Println(a)
}
// 1

// 我们注意一个特殊的变量 _(下划线),上一节中也有说到,其实 _ 用在方法体内作为方法返回值的接收是最常见的用途
func main() {
    a, _ := 1, 3
    fmt.Println(a)
}
// 3被抛弃

全局变量和局部变量的使用看业务,一个变量多处使用可以使用全局变量,如果只是方法体内或者循环判断里用得到那就直接用局部变量即可。

如果全局变量的首字母大写,那么它就是公开的全局变量,也叫公有变量;如果全局变量的首字母小写,那么它就是内部的全局变量,也叫私有变量。内部的全局变量只有当前包内的代码可以访问,外面包的代码是不能看见的。

常量

Go语言提供了常量关键字 const,特征是不可修改,定义时必须初始化。

const a int = 1 

// 支持同时设置多个常量
const (
    a = "hello"
    b = true
    c = 3
)

以上,Go 语言的三种变量就简单介绍完了,接下来我们看看 Go 语言有哪些类型

Go常见类型

布尔型:bool
长度为1字节,取值范围:true,false,注意不可以用数字代替

整型:int / uint
会根据系统决定是32位还是64位,从而决定占4字节还是8字节;int 表示有符号整数,可以表示正负;
uint 表示无符号整数,只能表示非负整数

8位整型:int8 / uint8
长度为 1 字节,取值范围:-128~127 / 0~255;
取值范围计算: 比如 int8 ,取值范围就是 2^8 = 256,然后正负各一半,中间有个0,
所以范围是 -128 ~ 127;uint8 也是这么算,只不过没有负数,从0开始,所以范围是 0 ~ 255。

16位整型:int16 / uint16
长度为 2 字节,取值范围:-2^15 ~ 2^15-1 / 0 ~ 2^16-1

32位整型:int32 / uint32
长度为 4 字节,取值范围:-2^31 ~ 2^31-1 / 0 ~ 2^32-1

64位整型:int64 / uint64
长度为 8 字节,取值范围:-2^63 ~ 2^63-1 / 0 ~ 2^64-1

字符串类型:string

字节型:byte(uint8 的别名)
长度为 1 字节,取值范围:0~255

字符型:rune(int32 的别名)
长度为 4 字节,取值范围:0~255,用于存放 Unicode 码点

浮点型:float32 / float64
长度为 4/8 字节,小数点位置:7/15 位小数,默认是float64

负数:complex64 / complex128
长度为 8/16 字节,这个基本用不上吧。。。

指针类型:uintptr
可以保存指针的无符号整数型,根据操作系统决定32位还是64位

引用类型:slice / map / chan
这三者是需要通过 make 来创建才能使用

其他:array、struct、func、interface、error

上述罗列了 Go 语言中的类型,需要注意的一点是,这些类型的变量之间不允许互相赋值或操作,不然会在编译时引起编译器报错。比如:

func main() {
    var a int
    var b int8
    c := a + b
}
// invalid operation: a + b (mismatched types int and int8)

另外,Go 的字符串可以理解为字节串,由于 Go 采用 UTF-8 编码,一个英文占一个字节,一个中文占3个字节,所以无法直观的定位某个字符,从而引申出字节型 byte 和字符型 rune,这个后续再展开讨论。

类型零值

接下来看看类型的零值。这里零值不等于空值,而是变量声明后的默认值;通常情况下分为以下几种

值类型: 0
布尔型: false
字符串: ""

Go 关键字

这里实名表扬一下,Go 的关键字比 Java 等其他语言少太多了~ 不用记住,混个眼熟就行

break    default      func    interface    select
case     defer        go      map          struct
chan     else         goto    package      switch
const    fallthrough  if      range        type
continue for          import  return       var

iota枚举

Go 语言内置了一个特殊的关键字 iota,这个关键字用来声明enum的时候采用,它默认开始值是0,后续每增加一行加1,下面看下代码实现

// 只要第一个声明了 iota,后续的变量会自动累加
// iota 在同一行值相同
const (
    a       = iota             //a=0
    b       = "bbb"
    c       = iota             //c=2
    d, e, f = iota, iota, iota //d=3,e=3,f=3
    g       = iota             //g = 4
)

本章小结

这一节主要是讲了 Go 语言中三种变量以及变量的不同定义方式;接下来了解了 Go 语言的类型系统,除了常见的基本类型还简单介绍了一些扩展类型以及类型的零值等,这里先混个眼熟,后面我们用得上的时候再去研究;后面捎带了一下 Go 的关键字 和 iota 枚举。下一节我们开始学习 Go 语言的循环控制流,这一节很简单,比你学的其他语言都简单~

导航

  • 上一节:学习Go的准备工作
  • 下一节:Go语言的控制流

文章来源于互联网,如有雷同请联系站长删除:1、Go语言的变量与类型.md

发表评论