首页 > 其他分享 >go语言基础-基础数据类型之常量

go语言基础-基础数据类型之常量

时间:2023-08-04 10:25:43浏览次数:37  
标签:const 常量 数据类型 基础 类型 使用 go iota 赋值

常量使用关键字const定义,用于存储不会改变的数据。

存储在常量中的数据类型只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。

常量的定义格式:const identifier [type] = value,例如:

const Pi = 3.14159

在Go语言中,你可以省略类型说明符[type],因为编译器可以根据变量的值来推断其类型。

  • 显式类型定义:const b string = "abc"
  • 隐式类型定义:const b = "abc"

一个没有指定类型的常量被使用时,会根据其使用环境而推断出其所需要具备的类型。换句话说,未定义类型的常量会在必要的时刻根据上下文来获得相关类型。

var n int
f(n + 5) // 无类型的数字型常量 “5” 它的类型在这里变成了 int

常量的值是必须能够在编译时就能够确定的;你可以在其赋值表达式中涉及计算过程,但所有用于计算的值必须在编译期间才能获得。

  • 正确的做法:const c1 = 2/3
  • 错误的做法:const c2 = getNumber()// 引发构建错误:getNumber() used as value

因为在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()

数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致失败:

const Ln2 = 0.693147180559945309417232121458\
            176568075500134360255254120680009
const Log2E = 1/Ln2 // this is a precise reciprocal
const Billion = 1e9 // float constant
const hardEight = (1 << 100) >> 97

根据上面我们可以看到的例子,反斜杠\可以在常量表达式中作为多行的连接符使用。

与各种类型的数字类型变量相比,你不必担心常量之间的类型转换问题,因为它们都是非常理想的数字。

需要注意的是,当常量赋值给一个精度过小的数字型变量时,可能会因为无法正确表达常量所代表的数值而导致失败,这会在编译期间就引发错误。另外,但是常量也允许使用属性属性的形式:

const beef, two, c = "eat", 2, "veg"
const Monday, Tuesday, Wednesday, Thursday, Friday, Saturday = 1, 2, 3, 4, 5, 6
const (
    Monday, Tuesday, Wednesday = 1, 2, 3
    Thursday, Friday, Saturday = 4, 5, 6
)

常量还可以枚举:

const (
    Unknown = 0
    Female = 1
    Male = 2
)

现在,数字012分别代表未知性别、女性和男性。这些枚举值可以用于测试某些变量或常量的实际值,比如使用 switch/case 结构。

在这个例子中,iota可以被设置枚举值:

const (
    a = iota
    b = iota
    c = iota
)

第一个iota等于 0,只要iota在新的一行被使用时,它的值都会自动加 1,并且没有赋值的常量默认会应用上一行的赋值表达式:

// 赋值一个常量时,之后没赋值的常量都会应用上一行的赋值表达式
const (
a = iota // a = 0
b // b = 1
c // c = 2
d = 5 // d = 5
e // e = 5
)

// 赋值两个常量,iota 只会增长一次,而不会因为使用了两次就增长两次
const (
Apple, Banana = iota + 1, iota + 2 // Apple=1 Banana=2
Cherimoya, Durian // Cherimoya=2 Durian=3
Elderberry, Fig // Elderberry=3, Fig=4

)

// 使用 iota 结合 位运算 表示资源状态的使用案例
const (
Open = 1 << iota // 0001
Close // 0010
Pending // 0100
)

const (
_ = iota // 使用 _ 忽略不需要的 iota
KB = 1 << (10 * iota) // 1 << (10*1)
MB // 1 << (10*2)
GB // 1 << (10*3)
TB // 1 << (10*4)
PB // 1 << (10*5)
EB // 1 << (10*6)
ZB // 1 << (10*7)
YB // 1 << (10*8)
)

iota也可以用表达式中,如:iota + 50。在每遇到一个新的常量块或单个常量声明时,iota都会重置为 0(简单地讲,每遇到一次 const 关键字,iota就重置为 0) 。

当然,常量随后为常量就是恒定不变的量,我们无法在程序运行过程中修改它的值;如果你在代码中尝试修改常量的值则引发编译错误。

标签:const,常量,数据类型,基础,类型,使用,go,iota,赋值
From: https://www.cnblogs.com/songyunjie/p/17605171.html

相关文章

  • go语言基础-语言的核心结构与技术之基本结构要素
    packagemainimport"fmt"funcmain(){fmt.Println("hello,world")}上述伪代码可以看到,学习go语言的基本语法,接下来,针对这段伪代码分析packagemain封装的概念,导入与可见性包是构造代码的一种方式:每个程序都由包(通常简称为pkg)的概念组成,可以使用自身的包或者......
  • Zookeeper基础命令
    一、事件监听在ZooKeeper中,可以通过注册事件监听器来监视ZNode的状态变化和节点的子节点变化1.stat-wpath1#NodeCreated创建2#NodeDataChanged修改3#NodeDeleted删除4stat-wpath2.ls-wpaht1#NodeDeleted删除2ls-wpath3.get-w/no......
  • Go - go get
    zzh@ZZHPC:~/zd/MyPrograms/Go/zapp10$gorunmain.gomain.go:6:5:norequiredmoduleprovidespackagegithub.com/XXX/zzhrepo1/calc;toaddit:gogetgithub.com/XXX/zzhrepo1/calczzh@ZZHPC:~/zd/MyPrograms/Go/zapp10$catgo.modmodulezapp10go1.2......
  • 【随便学学】和声学基础
    1.常用基本和弦2.和弦级数3.和声进行......
  • Go语言
    GO语言深思熟虑之后决定先入门go折腾折腾,本来也犹豫不定,但是悠哥说的那句,年轻就是要去折腾.不管如何就先,开始着手去学习,而不是沉静在焦虑中..首先是GO的安装参考csdn上的https://blog.csdn.net/qq_44830881/article/details/123457805然而在我按照这个完成安装之后我运行hello......
  • websocke在django中使用
    目录一、websocket介绍:二、后端1.安装(基于django3.x)2.settings配置3.修改asgi文件(默认不支持websocket,只支持http)一、websocket介绍:channels4.0之后默认不带Daphne服务器了。解决方案可以有两种:1.指定channels的版本为3.x;2.安装时使用pip3install-Uchannels[“dap......
  • 深入理解GOT表覆写技术——[email protected] 理解该题目就明白了
    深入理解GOT表覆写技术 0x00:前言玩pwn的时候,有时要用到got表覆写技术,本文在于分享对GOT表覆写技术的理解,铺垫性的基础知识较多,目的在于让初学者知其然,还要知其所以然! 0x01:ELF文件生成过程//hello.c#include<stdio.h>intmain(){printf("HelloWorld!n");return0;}......
  • 【设计模式】装饰器模式Decorator:在基础组件上扩展新功能
    (目录)装饰器模式看上去和适配器模式、桥接模式很相似,都是使用组合方式来扩展原有类的,但其实本质上却相差甚远呢。简单来说,适配器模式侧重于转换,而装饰模式侧重于动态扩展;桥接模式侧重于横向宽度的扩展,而装饰模式侧重于纵向深度的扩展。原理装饰模式的原始定义是:允许动态地向......
  • 【Java基础】Java 入门第一步
    ......
  • MongoDB
    MongoDB简介对于社交类软件的功能特点:数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态内容地理位置的查询……针对以上特点,我们来分析一下:mysql:关系型数据库(效率低)redis:redis缓存(微博,效率高,数据格式不丰富)对于数据量大而言......