01. Golang变量与常量

· · 859 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang变量与常量

一、变量

1). 变量声明

  1. 对于纯粹的变量声明,Go语言引入了关键字var,而类型信息放在变量名之后。
var v1 int
var v2 string
var v3 [10]int // 数组
var v4 []int   // 切片数组
var v5 struct {
    f int
}
var v6 *int  // 指针
var v7 map[string] int // map,key为string类型,value为int类型
  1. 变量声明语句不需要使用分号作为结束符。

  2. var的另一种用法是将若干个需要声明的变量放置在一起,免得重复写var关键字

var {
    v1 int
    v2 string
}

2). 变量初始化

  1. 对于声明变量时需要进行初始化的场景,var关键字可以不写。
var v1 int = 10 // 完整写法
var v2 = 10     // 编译器会自动推导出v2的类型
v3 := 10        // 编译器会自动推导出v3的类型

冒号和等号的组合 := 用于明确表达同时进行变量声明和初始化的工作;左侧的变量不应该是已经被声明过,否则会导致编译出错。

3). 变量赋值

  1. 变量初始化和变量赋值是不同的概念,下面为声明一个变量之后的赋值过程。
var v10 int
v10 = 123
  1. 多重赋值特性,交换两个变量的值
i, j = j, i

4). 匿名变量

Go语言支持函数返回多个返回值,而且可以使用 _ 进行占位。

func GetName() (firstName, lastName, nickName string) {
    return "Liu", "Cheng", "Hahadasheng"
}

// 只想获取一个返回值
_, _, nickName := GetName()

二、常量

Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。

1). 字面常量

  1. 所谓字面常量(literal), 指程序中硬编码的常量。如下
-12
3.14159265358979323846  // 浮点类型的常量
3.2+12i                 // 复数类型的常量
true                    // 布尔类型的常量
"foo"                   // 字符串常量
  1. 其他语言中,比如Java,定义一个long类型的常量写法为 long a = 5L;Go语言的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应类型的值域范围内,就可以作为该类型的常量,比如上面的常量12,它可以赋值给 int 、 uint 、 int32 、int64 、 float32 、 float64 、 complex64 、 complex128 等类型的变量。

2). 常量定义

  1. 使用 const 关键字为字面值取名。
const Pi float64 = 3.14159265358979323846
const zero = 0.0  // 无类型浮点常量
const {
    size int64 = 1024
    eof = -1 // 无类型整形常量
}
const u, v float32 = 0, 3 // U = 0.0, V = 3.0, 常量的多重复赋值。
const a, b, c = 3, 4, "foo" // 无类型整型和字符串常量
  1. Go的常量定义可以限定常量类型,但不必须,如果定义常量是没有指定类型,则与字面常量一样,是无类型的常量。

  2. 常量定义的右值可以是一个在编译器预算的常量表达式。

const mask = 1 << 3

常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式。

// 如下会报错
const Home = os.GetEnv("HOME")

3). 预定义常量

  1. Go语言预定了这些常量
    • true
    • false
    • iota: 很特殊,是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const关键字出现之前,没出现一次iota。其所代表的数字会自动增1。
const (       // iota被重设为0
    c0 = iota // c0 == 0
    c1 = iota // c1 == 1
    c2 = iota // c2 == 2
)

const (
    a = 1 << iota // a == 1 (iota在每个const开头被重设为0)
    b = 1 << iota // b == 2
    c = 1 << iota // c == 4
)

const (
    u = iota * 42          // u == 0
    v float64 = iota * 42  // v == 42.0
    w = iota * 42          // w == 84
)
  1. 如果两个const的赋值语句的表达式是一样的,可以省略后一个赋值表达式。
const (
    c0 = iota // c0 == 0
    c1 =      // c1 == 1
    c2 =      // c2 == 2
)

const (
    a = 1 << iota // a == 1
    b             // b == 2
    c = 2 << iota // c == 8
    d             // c == 16
)

4). 枚举

  1. 枚举指一些列相关的常量;可以使用const(...)这种形式表示枚举; Java中的枚举是使用enum关键字,反编译其实是实现一个抽象类,定义了一系列静态实例变量
const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    numberOfDays // 这个常量没有导出
)

与Go语言的其他符号(symbol)一样,以大写字母开头的常量在包外可见。上面的numberOfDays为包内私有其他符号则可以被其他包访问。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:

查看原文:01. Golang变量与常量

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

859 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传