Golang之常量与基本数据类型

摘要:
Packagemainimport//常量定义和赋值constWorldstring=“world”//多常量初始化constx,yint=1,2//常量类型推断,字符串类型consts1=“Helloworld”//常量组const//1。可以省略除第一个常量组之外的常量组。//2。如果省略初始化表达式,则默认使用前一个常量的表达式//3。当常量与常量/*111c4444c4444*/////相同时,还可以定义函数的返回值常量/*输出结果:abc38*/funcmain(){fmt.Printlnfmt.Printlnfmt.Println fn}1.2 Go常量iota的iota常量生成器用于生成一组具有类似规则的初始化常量。在const常量(第一个常量的行)声明的语句中,iota值为0。之后,在每个常量声明中添加一个。

1.1 Go常量

  • 常量代表只读的, 不可修改的值,用 const 关键字定义

  • 常量和变量一样,可以批量声明,或者一组相关的常量。

  • 常量的计算都是在编译期间完成的, 并非运行期间!从而减少运行时的工作。

  • 未使用的常量不会应发编译错误。(这点和变量不一样)

package main

import (
	"fmt"
  "unsafe"
)

// 常量定义且赋值
const World string = "世界"

// 多常量初始化
const x,y int = 1,2

// 常量类型推断,字符串类型
const s1 = "Hello world"

// 常量组
const (
	e = 2.7182818284590452353
  pi = 3.14159
  b bool = true
)
//  1. 常量组,可以除了第一个外其他的常量右边的初始化表达式可省略
//  2. 如果省略初始化表达式,默认使用前面常量的表达式
//  3. 遇上一个常量相同
const (
	c1 =1
  c2
  c3
  c4='c4444'
  c5
)

/*
	1
	1
	1
	c4444
	c4444
*/
// 常量也可以定义函数的返回值
const(
	f1="abc" // 长度为3的字符串的类型
  f2 = len(f1)  // 返回长度的函数结果
  f3 = unsafe.Sizeof(f2)  // 返回f2所占用的内存大小
)
/*
	输出结果:
	abc
	3
	8
*/
func main(){
  fmt.Println(f1)
  fmt.Println(f2)
  fmt.Println(f3)
}

1.2 Go常量之iota常量生成器

iota 用于生成一组相似规则的初始化的常量,在const常量声明的语句中,第一个常量所在行,iota 值为0,之后每一个常量声明加一。

例如time 包的例子,一周七天,每天可以定义为常量,1-6,周日为0,这种类型也称为 枚举。

package main

import (
	"fmt"
)

const(
	Sunday = iota
  Monday  // 通常省略后续行表达式
  Tuesday
  Wednesday
  Thursday
  Friday
  Saturday
)

func main(){
  fmt.Println(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)
}

注:如果iota 表达式被打断,需要显示恢复

package main

import (
	"fmt"
)

const (
	A= iota // 初始化0
  B  // +1
  C = "c"
  D  // c,与上面相同
  E = iota  //4 ,显式恢复。注意计数包含了C、D 两个,此时为4
  F  // 5 恢复iota +1 
)

func main() {
    fmt.Println(A, B, C, D, E, F)
}

// 输出结果
// 0 1 c c 4 5

1.3 Go 整数类型

Go语言的数值类型包含不同大小的整数类型、浮点数和负数,美中数值类型都有大小范围以及正负符号。

package main

imprort "fmt"

func mainz(){
  var n1 = 100
  fmt.Printf("n1的类型: %T 
",n1)
}

输出结果

n1 的类型:int

1、查看变量的字节大小,和数据类型

package main

import (
	"fmt"
  "unsafe"
)

func main(){
	var n2 int64 = 100
  // unsafe 包地下的Sizeof函数, 返回变量占用字节数
  fmt.Printf("n2的类型是:%T,占用的字节数是%d",n2,unsafe.Sizeof(n2))
}

输出结果

n2的类型是 int64, 占用的字节数是8

1.4 数字类型

序号类型和描述
1uint8 无符号 8 位整型 (0 到 255)
2uint16 无符号 16 位整型 (0 到 65535)
3uint32 无符号 32 位整型 (0 到 4294967295)
4uint64 无符号 64 位整型 (0 到 18446744073709551615)
5int8 有符号 8 位整型 (-128 到 127)
6int16 有符号 16 位整型 (-32768 到 32767)
7int32 有符号 32 位整型 (-2147483648 到 2147483647)
8int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)

1.5 Go浮点型

Go语言提供两种精度的浮点数,float32float64 ,编译器默认声明为float64

小数类型就存放小数的, 如 1.2,0.005,-2.32

package main

import "fmt"

func main(){
  var price float32 = 100.02
  fmt.Printf("price 类型是:%T,值是%v",price,price) // %T 是类型, %v 是默认值
}
类型占用存储空间表述范围
单精度float324 字节-3.403E38 ~ 3.403E38
双精度float648字节-1.798E308~1.798E308

浮点数的形式 : 浮点数 = 符号位 + 指数位 + 位数位

package main

import "fmt"

func main(){
	var price float32 = 11.22 // 正数符号
  fmt.Println("price=",price)
  var num1 float32 = -3.4  // 负数符号
  var num2 float64 = -8.23
  fmt.Println("num1=",num1,"num2=",num2)
  
  // 尾数可能丢失,精度缺失
var num3 float32 = -123.11111111105//精度丢失了    
var num4 float64 = -123.11111111105//float64的精度高于float32

fmt.Println("num3=", num3, "num4=", num4)
// 输出结果
// num3= -123.111115 num4= -123.11111111105
}

1.6 Go字符类型

Golang 中没有专门的 字符 类型,如果要存储单个 字符(字母),一般使用 byte 来保存。

普通字符串就是一串固定长度的字符连接起来的字符序列

Go的 字符串 是由 单个 字节 连接起来的。

也就是说对于传统的 字符串 是由 字符组成的,而Go的字符串不同,它是由字节组成的。

Go的字符用的 单引号 表示

Go的字符串用 双引号 表示

package main

import "fmt"

func main(){
	var c1 byte = 'a'
  var c2 byte = '2'  // 字符的2
  
  // 直接输出byte的值,也就是输出对应的字符的码值
  fmt.Println("c1=",c1)
  fmt.Println("c2=",c2)
  
  // 输出字符的值,需要格式化输出
  fmt.Printf("c1值%c c2值=%c
",c1,c2)
}
/*
输出结果:
	c1= 97
	c2= 50
	c1值a c2值=2
*/

Go 变量保存的byte对应值ASCII表,范围在 [0-1,a-z,A-Z]

如果保存的饿字符对应码大于255,应该使用int而不是byte,否则 overflows byte 异常

var c3 int = '皮' // 正确
var c4 byte = '皮' // overflows byte 报错

Go语言默认字符编码UTF-8,统一规定

Go字符的本质是一个整数,直接打印是UTF-8编码的值

给与变量赋值整数,按 %c 格式化输出得到的是unicode字符

var c4 int = 22269
fmt.Printf("c4=%c
",c4)
// 输出的结果是c4=国

Go语言允许使用转义符号""

Go语言字符类型允许计算,相当于整数运算,因为字符拥有对应的Unicode

1.7 Go布尔值

一个布尔冷的值只有两种:truefalse

iffor 语句的条件部分都是布尔类型的值,并且 ==< 等比较操作也会产生布尔类型的值。

package main

import (
	"fmt"
  "unsafe"
)

func main(){
	var b = true
  fmt.Println("b=",b)
  fmt.Println("b字节数=", unsafe.Sizeof(b))
}

// 输出结果:
// b= true
// b字节数=1

免责声明:文章转载自《Golang之常量与基本数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转发 GSLB概要和实现原理Linux下的主要的C语言编译器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据库(DB)

1.定义: 存放数据的仓库,按照数据结构来组织、存储和管理数据的仓库 2.数据库类型 1.关系型数据库: 以表的形式存储数据,表与表之间有很多复杂的关联关系。关系型数据库遵循结构化查询语言SQL标准和ACID原则。常见的关系型数据库有MySQL,SQLServer,Oracle等 2.非关系型数据库 NoSQL,Not Only SQL:是分布式、非关系型...

ArcMap 2 数据矢量化

若有不妥,还请见谅。留下留言,与君共勉。 前言:GIS专业的同学或与GIS接触的专业或其它,应该了解到数据的“矢量化”的不(酸)易(爽)。以目前博主的水平,本文暂时只能提供两种数据“矢量化”的方式。大家有好的方法或以后我接触的更多,会再次更新本博文。该博客的系列文章都会时常更新,离不开大家的建议。 本篇博文请与下一篇博文ArcMap 3 矢量数据下载(下载...

全链路压测(1):认识全链路压测

前言 之前断断续续写过一些全链路压测相关的技术文章,很多同学评价还不错。朋友建议我写个系列,基于自己的落地实践经验,对全链路压测做个系统性的梳理总结。 今年跳槽后我的工作重心也偏向了全链路压测和稳定性保障方面的研究,这个时间点写这个系列,也算是对自己过去工作的最好总结。 整体写作规划里,这个系列大概有14篇内容,不排除后期有新的理解和沉淀,会加更。目前草...

【数据结构第二周】堆栈知识点整理

堆栈(Stack):具有一定操作约束的线性表 只在一端(栈顶,Top)做插入和删除 1、栈的顺序存储实现 栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。 (1)存储 #define MaxSize <储存数据元素的最大个数> typedef struct { ElementType Data[MaxSize] int...

mvn打包时,出现数据库连接错误

原因: maven在install的时候会默认去执行test包下的test示例,导致打包失败,只需要把测试注释掉就可以了包括类上的注解,或者在install的时候跳过测试,install -Dmaven.test.skip=true 重新输入:mvn install -Dmaven.test.skip=true 打包成功!...

各种数据分析工具所能处理的数据量大概是多少?

数据科学交流群,群号:189158789 ,欢迎各位对数据科学感兴趣的小伙伴的加入! 1.Excel Excel 处理的单表最大数据量为1048576行和16384列。一般来说处理规模在100万行以下的数据较为合适。 2.PowerBI PowerBI Desktop一般处理的数据在1G左右再往上就会很卡,一般处理的规模在不大于1G或者说1000万行以下的...