常量的定义
- 常量的值在编译时就已经确定
- 常量的定义格式与变量基本相同
- 等号右侧必须是常量或者常量表达式
- 常量表达式中的函数必须是内置函数
package main
import "fmt"
const a int = 1
const b = "B"
const (
c = "c"
d = len(c)
e = d * 2
)
const f, g, h, i = 1, true, "h", len("love")
const (
j, k, l, m = 1, "a", true, float64(len(k)) * 100.123
)
func main() {
fmt.Println(a, b, c, d, e, f, g, h, i, j, k, l, m)
}
常量的初始化规则与枚举
- 在定义常量组时,如果不提供初始值,则表示将使用上行的表达式
- 使用相同的表达式不代表具有相同的值
- iota是常量的计数器,从0开始,组中每定义1个常量自动递增1
- 通过初始化规则与iota可以达到枚举的效果
- 每遇到一个const关键字,iota就会重置为0
package main
import "fmt"
const (
a = "a"
b
c
d
e = iota
f
g
)
const (
h = iota
i
j
)
func main() {
fmt.Println(a, b, c, d, e, f, g, h, i, j)
}
package main
import "fmt"
const (
_ = iota
KB float64 = 1 << (iota * 10)
MB
GB
TB
PB
EB
ZB
YB
)
func main() {
fmt.Println(KB)
fmt.Println(MB)
fmt.Println(GB)
fmt.Println(TB)
fmt.Println(PB)
fmt.Println(EB)
fmt.Println(ZB)
fmt.Println(YB)
}
运算符
Go中的运算符均是从左至右结合
优先级(从高到低)
^ ! (一元运算符)
* / % << >> & &^
+ - | ^ (二元运算符)
== != < <= >= >
<- (专门用于channel)
&&
||
package main
import "fmt"
/*
6: 0110
11: 1011
---------
& 0010 只有都是1的时候,才是1
| 1111 只要有一个是1,就是1
^ 1101 只有一个是1的时候,才是1
&^ 0100 第二个参数为1的,把第一个参数的改为0
*/
func main() {
/*
正整数的补码是其二进制表示,与原码相同;
负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1
按位取反 0 0010
取补码 0 0010
按位取反 1 1101 这个也是补码,
减去1 1 1100
再取反, 1 0011 但符号位不变
得 -3
*/
fmt.Println(^2)
fmt.Println(!true) //false
fmt.Println(1 << 10) //1024
fmt.Println(1 << 10 >> 10) //1024
fmt.Println(6 & 11) //0010
fmt.Println(6 | 11) //1111
fmt.Println(6 ^ 11) //1101
fmt.Println(6 &^ 11) //0100
}
指针
Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不
支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针
目标对象的成员
- 操作符”&”取变量地址,使用”*”通过指针间接访问目标对象
- 默认值为 nil 而非 NULL
package main
import "fmt"
func main() {
a := 1
var p *int = &a
fmt.Println(p)
fmt.Println(*p)
}
递增递减语句
在Go当中,++ 与 – 是作为语句而并不是作为表达式
a := 1
a++
a--
//这是不允许的,只能作为语句,表达式不可以
//b := a++