4. 常量与运算符
include
- 常量的定义
- 常量的初始化规则与枚举
- 在定义常量组的时候,如果不提供初始值,则表示使用上行的表达式
- iota
- 运算符(一元运算符,二元运算符)
常量的定义
- 常量的值在编译的时候就已经确定了
- 常量的定义格式与变量基本相同
- 等号右侧必须是常量或者常量表达式
- 常量表达式中的函数必须是内置函数
- 常量最好使用全部为大写,如果不想被外部调用,那么可以在常量前面添加_,如_MAX_CONN
下面请看赋值的代码:
const a int =1
const b = "A"
const (
c=a
d=a+1
c=a+2
)
const a,b,c = 1,2,3
常量的初始化规则与枚举
- 在定义常量组的时候,途观不提供初始值,则表示使用上行的表达式
- 使用相同的表达式不代表具有相同的值
- iota是常量的计数器,从0开始,组中每定义1个常量自动递增1
- 通过初始化规则与iota可以达到枚举的效果
- 每遇到一个const关键字,iota就会重置为0
在定义常量组的时候,如果不提供初始值,则表示使用上行的表达式
常量的值不能依赖于变量,变量在运行的时候才会使用,所以像下面的代码,在编译的时候就会报错:
var xx = 123
const (
c = len(xx)
b
c
)
但是下面的例子是正确的,常量的值依赖于另一个常量:
const (
c = "sadfasdf"
b = len(c)
)
我们再看一个例子,如果使用小括号批量赋值给常量的时候,如果第一个常量有值,剩下的没有值,那么默认剩下的常量的值会继承第一个常量的值。代码如下:
package main
import (
"fmt"
)
const (
c = "sadfasdf"
b // b 和 a都没有赋值,所以我们在打印的时候,abc三个值都是一样的
a
)
func main() {
fmt.Println(b, a) // b 和 a都没有赋值,所以我们在打印的时候,abc三个值都是一样的
}
如果一行有多个常量赋值,也可以这么写
package main
import (
"fmt"
)
const (
c, b = "sadfasdf", 1123
a, d // a,d这两个常量的数量必须和第一行保持默认才行,即上面多少个常量下面就得多少个,保持一致才行
v, y
)
func main() {
fmt.Println(v, a, y)
iota
iota能够显示这个常量在const组里面的第几个常量,代码如下
const (
c = "sadfasdf"
a = iota
he = 12344
v = iota
d
)
func main() {
fmt.Println(d, c)
}
打印的结果是:4 sadfasdf ,iota的值从第一个常量开始为0,然后递增1,所以d为4。
下面再看一个例子:
const (
c = "sadfasdf"
a = iota
he = 12344
v = iota
d
)
const (
y = iota
)
func main() {
fmt.Println(d, c, y)
}
y打印出来的值为0,因为iota在遇到新的const的时候,会自动重置为0,所以y为0
运算符
- go中的运算符均是从左往右结合的
优先级
一元运算符是最高的,二元是最低
- ^ !(取反) 一元运算符
-
- / % <<(左移) >>(右移) & &^ + - | ^ == != < <= >= > 二元运算符
- <- 专门用于channel
- && 或关系
- || 否关机
如何判断^ 是属于一元运算符还是二元运算符
标准: ^ 如果左右都有数字就是二元,只有右侧有数才是一元
一元
func main() {
fmt.Println(^2)
}
二元:
func main() {
fmt.Println(1 ^ 2)
}
& &^ | ^ */ 位运算符讲解
我们举个例子:
十进制数字 | 二进制数字 |
---|---|
6 | 0110 |
11 | 1011 |
我们拿上面两个数计算来得
运算符 | 作用 | 二进制结果 | 十进制结果 |
---|---|---|---|
& | 二进制位全为1 才为1 | 0010 | 0 |
| | 二进制位有1即为1 | 1111 | 15 |
^ | 二进制位全为1 就为0 | 1101 | 13 |
&^ | 第二个数位1的时候,才会把第一个数的相同位改为0 | 0100 | 4 |
练习例子之生成随机数,git
- 生成100以内的随机数和10个浮点随机数
// randnum
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
var a []int
var b []float64
for i := 0; i < 11; i++ {
a = append(a, rand.Intn(100))
b = append(b, rand.Float64()*10)
}
fmt.Println(a)
fmt.Println(b)
}