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)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构