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 中实现常量的方式非常独特。

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


相关文章
|
8天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
39 0
|
1天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
33 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
13 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
4天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
5天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go
|
6天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
135 1