Go 语言入门很简单 -- 4. 常量 #私藏项目实操分享#

简介: Go 语言入门很简单 -- 4. 常量 #私藏项目实操分享#

常量

上节,我们讲到 变量,这节我来看看常量,常量就是不变的量,恒定的量。

Go 支持常量。常量可以保证在编译阶段就计算出表达式的值,并不需要等到运行时,从而使得编译器可以在任何时候就知道这个值。

常量的本质其实属于基本类型,如布尔型、字符串或数字。

常量的创建方式与创建变量的方式相同,但我们使用 const 关键字代替 var 关键字:

package main
import "fmt"
func main() {
    const hello string = "Hello World"
    fmt.Printlb(x)
}


如果我们更改一个常量的话,比如这样:

const hello string = "Say Hello to you"
hello = "Hello, Bro"

会得到这样的提示:

Variables\main.go:6:8: cannot assign to hello (declared const)

常量是在程序中复用而不用每次都写出来的好方法。 例如 math 包中的圆周率 Pi 和自然常数 E 被定义为一个常数。

fmt.Println(math.E)
// 结果为:2.718281828459045

让我们来计算一个圆的面积和周长,看如下代码:

package main
import (
    "fmt"
    "math"
)
func main() {
    const (
        hello string  = "Hello,"
        pi    float64 = math.Pi
    )
    var (
        name string
        r    float64
    )
    fmt.Print("Enter your name: ")
    fmt.Scanf("%s", &name)
    fmt.Println(hello + name)
    fmt.Print("让我们来学习圆,请输入圆的半径: ")
    fmt.Scanf("%f", &r)
    fmt.Printf("半径为%f的圆周长: %f\n", r, 2*pi*r)
    fmt.Printf("半径为%f的圆面积: %f", r, pi*r*r)
}

运行后,得到结果如下:

Hello, Bro
半径为3的圆周长: 18.84955592153876
半径为3的圆面积: 28.274333882308138
半径为3的圆面积: 28.274333882308138

定义多个变量

Go 提供了定义多个变量的简写方式:

var (
  a = 3
  b = 4
  c = 5
)

使用关键字 var(或 const)后跟括号,每个变量都定义在单独行上。

Demo

package main
import (
    "fmt"
    "math"
)
func main() {
    const hello string = "Hello,"
    const pi float64 = math.Pi
    var (
        name string
        r    float64
    )
    fmt.Print("Enter your name: ")
    fmt.Scanf("%s", &name)
    fmt.Println(hello + name)
    fmt.Print("让我们来学习圆,请输入圆的半径: ")
    fmt.Scanf("%f", &r)
    fmt.Printf("半径为%f的圆周长: %f\n", r, 2*pi*r)
    fmt.Printf("半径为%f的圆面积: %f", r, pi*r*r)
}

运行结果:

$ go run main.go
Enter your name: Rain
Hello,Rain
让我们来学习圆,请输入圆的半径: 4
半径为4.000000的圆周长: 25.132741
半径为4.000000的圆面积: 50.265482

常量生成器 iota

常量的声明可以使用常量生成器 iota,可以创建一系列相关的值,而不用逐个值显式写出。

iota 中,从 0 开始取值,逐个加 1,例如定义一星期,从 Sunday 开始,其值为 0。

package main
import "fmt"
type Weekday int
const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)
func main() {
    fmt.Printf("Sunday 是一周的第 %d 天\n", Sunday)
    fmt.Printf("Monday 是一周的第 %d 天\n", Monday)
    fmt.Printf("Tuesday 是一周的第 %d 天\n", Tuesday)
    fmt.Printf("Wednesday 是一周的第 %d 天\n", Wednesday)
    fmt.Printf("Thursday 是一周的第 %d 天\n", Thursday)
    fmt.Printf("Friday 是一周的第 %d 天\n", Friday)
    fmt.Printf("Saturday 是一周的第 %d 天", Saturday)
}

$ go run main.go
Sunday 是一周的第 0 天
Monday 是一周的第 1 天
Tuesday 是一周的第 2 天
Wednesday 是一周的第 3 天
Thursday 是一周的第 4 天
Friday 是一周的第 5 天
Saturday 是一周的第 6 天

无类型常量

Go 的常量有一些特别之处,上面我们定义的常量都是基本数据类型,如 stringfloat64,但许多常量并不从属于某一具体类型。

编译器将这些从属类型待定的常量表示成某些值,这些值比基本类型的数字精度更高,且算数精度高于原生的机器精度。

从属待定的常量共有6种:

  • 无类型 布尔
  • 无类型 整数
  • 无类型 文字符号
  • 无类型 浮点数
  • 无类型 复数
  • 无类型字符串

const (
        deadbeef = 0xdeadbeef        // 无类型整数,值为 3735928559
        a        = uint32(deadbeef)  // uint32, 值为 3735928559
        b        = float32(deadbeef) // float32, 值为 3735928576(向上取整)
        c        = float64(deadbeef) // float64, 值为 3735928559
        d        = int32(deadbeef)   //  编译错误:溢出,int32无法容纳常量值
        e        = float64(1e309)    // 编译错误:溢出,float64,无法容纳常量值
        f        = uint(-1)          // 编译错误:溢出,uint 无法容纳常量值
    )
consts\main.go:31:19: constant 3735928559 overflows int32
consts\main.go:32:21: constant 1e+309 overflows float64
consts\main.go:33:18: constant -1 overflows uint

借助于推迟确定从属类型,无类型常量不仅能维持更高的精度,与类型已确定的常量相比,它们还能写出更多表达式而无需转换类型。

总结

常量是一种创建命名标识符的方法,该标识符的值永远不会改变。它们还为语言提供了难以置信的灵活性。在 Go 中实现常量的方式非常独特。

  • 常量不同于变量
  • 常量只存在于编译期
  • 无类型常量可以隐式转换,而类型常量和变量不能
  • 无类型常量视为具有种类,而不是类型
  • 了解显式和隐式转换


目录
打赏
0
0
0
0
6
分享
相关文章
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
11天前
|
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
27 3
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
622 0
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
188 0
|
13天前
|
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
26 0
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
125 7
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
98 8

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等