枚举

枚举指一系列的相关的常量,比如下面关于一个星期的中每天的定义,通过上篇博文,我们可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在go语言中通常用于定义枚举值。go语言并不支持众多其他语言明确支持的enum关键字。

下面是一个常规的枚举表示法,其中定义了一系列整型常量。

const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出 )

  同go语言中的其他符号(symbol)一样,以大写字母开头的常量在包外可见。

以上列子中 numberOfDays为包内私有,其他符号则可被其他包访问。

数据基本类型

布尔类型: bool

整数类型: int8、byte、int6、int、uint、uintptr等。

浮点类型: float32、float64。

复数类型:complex64、complex128。

字符串:string。

字符类型:rune。

错误类型:error。

处上之外,go语言还支持一下的复合类型。

指针(pointer)

数组(array)

切片(slice)

字典(map)

通道(chan)

结构体(struct)

接口(interface)

  上述类型的特点在于使用方便,但使用者不能对这些类型的长度做任何假设。对于常规的开发来说,用int和uint就可以了,没必要用int8之类明确指定长度的类型 ,以免导致移植困难。

布尔类型

go语言中的布尔类型与其他语言基本一致,关键字也是 bool ,可赋值为预定义的true和false。

var test bool
test = true
test_two := (1 == 2) // test_two也会被推导为bool类型 PS: 布尔类型不能接受其他类型赋值,不支持自动或强制的类型转换。 下面一些错误的语法:
var a bool
a = 1 // 语法错误
a = bool(1) // 语法错误 以下的用法才是正确:
var one bool
one = (1 != 0) // 正确语法
fmt.Println("result:", one) // go的输出 Println 输出结果:
result : true

 整型:

整型是所有语言里最基础的类型了。

类型                            长度                                    值范围
int8 1 -128 ~ 127
uint8(既byte) 1 0 ~255
int16 2 -32 768 ~ 32 767
uint16 2 0~65 535
int32 4 -2 147 483 648 ~ 2 147 483 647
uint32 4 0 ~ 4 294 967 295
int64 8 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
uint64 8 0 ~ 18 446 744 073 709 551 615
int 因平台而定 因平台而定
uint 因平台而定 因平台而定
uintptr 同指针 在32位平台下为4字节,64位平台下为8字节

  ①、类型表示

需要注意的是,int和int32在go语言里被认为是两种不同的类型,编译器也不会帮你自动做转换类型,比如以下的列子会有编译错误:

var value2 int32
value1 := 64 // value1将会被自动推导为int类型
value2 = value1 // 编译错误 编译错误类似于:
cannot use valu1 (type int) as type int32 in assignment。 使用强制类型转换可以解决这个编译错误: value2 = int32 (value1) //编译通过

  当然,开发者在做强制类型转换时,需要注意数据长度被截断而发生的数据精度损失(比如将浮点数强制转为整数)和值溢出(值超过转换的目标类型的值范围时)问题。

  ②、数值运算

go语言支持下面的常规整数运算: +、-、*、/、和%。加减乘除就不解释了,需要说下的是,%和C语言中一样是求余运算,比如:

5 % 3                              // 结果: 2

  ③、比较运算

go语言支持以下的几种比较运算符:   >  、 <  、 ==、>=、 <=和!=。这一点与其他大多数的语言相通,与C语言完全一致。

  ④、运算符

运算                    含义                        样   列
x << y 左移 124 << 2 // 结果为496
x >> y 右移 124 >> 2 // 结果为31
x ^ y 异或 124 ^ 2 // 结果为126
x & y 与 124 & 2 // 结果为0
x | y 或 124 | 2 // 结果为126
^x 取反 ^2 // 结果为3

  go语言的大多数位运算符与C语言都比较类似,除了取反在C语言中是~x,而在go语言中是^x。

浮点型

浮点型用于表示包含小数点的数据,比如1.234就是一个浮点型数据,在go语言中的浮点类型采用IEEE-754标准的表达方式。

①、浮点数表示

go语言定义了两个类型float32和float64,其中float32等价于C语言的float类型,float64等价于C语言的double类型。

在go语言中,定义一个浮点数变量的代码如下:

var fvalue1 float32

fvalue1 = 12
fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型

  对于以上列子类型被自动推导的fvalue2,需要注意的是其类型将被自动设为float64,而不管赋给它的数字是否使用32位长度表示的,因此,对于以上列子,下面的赋值将导致编译错误:

fvalue1 = fvalue2

而必须使用这样的强制类型转换:

fvalue1 = float32(fvalue2)

 ②、浮点数比较

因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等是不可行的,这可能会导致 不稳定的结果 。

下面是一种推荐的替代方案。import "mat// p为用户自定义的比较精度, 比如:0.00001

func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}  

  复数类型

复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示 实部(real),一个表示虚部(imag),如果了解了数学上的复数是怎么回事,那么go语言的复数就非常容易理解了。

①、复数表示

复数示例:

var value1 complex64            // 由2个float32构成复数类型

value1 = 3.2 + 12i
value2 := 3.2 + 12i //value2是complex128类型
value3 := complex(3.2, 12) //value3结果同value2

  ②、实部与虚部

对于一个复数z = complex(x, y),就可以通过go语言内置函数real(z)获得该复数的实部,也就是x,通过imag(z)获得该复数的虚部,也就是y。

字符串

在go语言中,字符串也是一种基本类型,相比之下,C/C++语言中并不存在原生的字符串类型,通常使用字符数组来表示,并以字符指针来传递。

go语言中一下是字符串的声明和初始化。

var str string   // 声明一个字符串变量

str = "Hello world"    // 字符串赋值

ch := str[0]              // 取字符串的第一个字符
fmt.Printf("The length of \"%s\" is %d \n", str, len(str))
fmt.Printf("The first character of \" %s\"is %c.\n", str, ch) 输出结果: The length of "Hello world" is 11 The first character of "Helllo world" is H.

  字符串的内容看可以用类似于数组下标的方式获取,但与数组不同,字符串的内容不能再初始化后被修改,比如一下列子:

str := "Hello world"    //  字符串也支持声明时进行初始化的做法

str[0] = "x"               //  编译错误

编译器会报类似如下错误:

cannot assign to str[0]

  字符串的操作

运算                    含义                                        样列

x + y                  字符串连接                   "Hello" + "123"    //  hello123
len(str) 字符串长度 len("hello") // 5
s[*] 取字符 "hello" [1] // e 更多方法请参考string标准库包!!!

  ①字符串遍历

go语言中支持两种遍历方式,一种是以字节数组的方式遍历:

str := "Hello,世界"
n := len(str)
for i := 0; i < n; i++ {
ch := str[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch)
} 结果:
0 72
1 101
2 108
3 108
4 111
5 44
6 32
7 228
8 184
9 150
10 231
11 149
12 140

  可以看出,这个字符串长度为13,尽管从直观上来说,这个字符串应该只有9个字符,这是因为每个中文字符在UTF-8中占三个字节,而不是壹个字节。

另一种是以Unicode字符遍历:

str := "Hello, 世界"
for i, ch := range str {
fmt.Println(i, ch) // ch的类型为true
} 结果:
0 72
1 101
2 108
3 108
4 111
5 44
6 32
7 19990
10 30028

  以Unicode字符方式遍历时,每个字符的类型是rune(早期的go语言用int类型表示Unicode字符),而不是byte。

字符类型

在go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值,另一个是rune,代表单个Unicode字符。

一起来学Go --- (go的枚举以及数据类型)的更多相关文章

  1. 51Node 1483----化学变换(暴力枚举)

    51Node  1483----化学变换 有n种不同的化学试剂.第i种有ai升.每次实验都要把所有的化学试剂混在一起,但是这些试剂的量一定要相等.所以现在的首要任务是把这些化学试剂的量弄成相等. 有两 ...

  2. Java从零开始学二十五(枚举定义和简单使用)

    一.枚举 枚举是指由一组固定的常量组成的类型,表示特定的数据集合,只是在这个数据集合定义时,所有可能的值都是已知的. 枚举常量的名称建议大写. 枚举常量就是枚举的静态字段,枚举常量之间使用逗号隔开. ...

  3. Rhythmk 一步一步学 JAVA (18): Enum枚举学习

    枚举定义: public enum SizeEnum { SMALL, BIG, BIGEST }; public enum SizeStringEnum { SMALL("小") ...

  4. 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...

  5. DF学Mysql(三)——Mysql数据类型

    Mysql数据类型分为:整数类型.浮点数类型.定点数类型日期与时间类型字符串类型二进制类型 整数类型 字节数 无符号数取值范围 有符号数取值范围TINYINT 1 0-255 -128-127SMAL ...

  6. 【和我一起学python吧】python的数据类型

    python的元组.列表.字典数据类型是很python(there python is a adjective )的数据结构.这些结构都是经过足够优化后的,所以如果使用好的话,在某些area会有很大的 ...

  7. 随学随记之java的数据类型

    Java中的变量只有两种数据类型:基本数据类型(8种).引用数据类型 定义变量时内存中的状态变化:定义数据类型,开辟空间,存放数据. 8种基本数据类型的变量各占多大的内存空间,变量的取值范围 byte ...

  8. 【学习笔记】--- 老男孩学Python,day4 编码,数据类型,字符串方法

    今日主要内容 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...

  9. 《从零开始学Swift》学习笔记(Day 24)——枚举

    原创文章,欢迎转载.转载请注明:关东升的博客  Swift中的枚举可以定义一组常量.提高程序的可读性:还具有面向对象特性. 使用enum关键词声明枚举类型,具体定义放在一对大括号内,枚举的语法格式如下 ...

随机推荐

  1. 浅谈redux-form在项目中的运用

    准则 先说一下redux的使用场景,因为如果没有redux,那更不会有redux-form. redux基于Flux架构思想,是一个状态管理框架,其目标是解决单页面应用中复杂的状态管理问题. 日常前端 ...

  2. springmvc精讲

    转自http://www.cnblogs.com/baiduligang/p/4247164.html

  3. [肯定不知道]PeopleSoft中PSADMIN你不知道的秘密

    PeopleSoft psadmin工具是用于管理PS App server,process scheduler 和 web server节点的.可以使用一些设置菜单选项来管理或配置上面提到的任何组件 ...

  4. RxSwift 实战操作【注册登录】

    前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是C ...

  5. Python爬虫初学(三)—— 模拟登录知乎

    模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...

  6. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  7. Git在tortoiseGit以及eclipse的使用方法

    一.Git安装与简单使用 1.安装git,tortoiseGit 2.创建SSH Key 打开Git Bash,然后输入ssh-keygen生成公钥和私钥: 3.生成ppk文件. 打开puttykey ...

  8. 尝试在CentOS7.2上编译安装Swift

    苹果提供 Ubuntu上构建Swift 的教程,通过这个教程我尝试使用CentOS7.2上玩儿一把.目前已经成功在CentOS7.2上班成功安装 swift 4.0 https://github.co ...

  9. vue指令v-on示例解析

    绑定事件监听器.事件类型由参数指定.表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略. 1.事件 .click .mouseover .keyup ...... 2.修饰符 .sto ...

  10. LoadRunner入门(二)

    三.设计场景 1.打开Controller 2.选择运行的脚本 3.场景设置 3.1修改场景模式 点击scenario-convert- 修改场景百分比模式 (1)Group Name:脚本名称 (2 ...