GO语言基础数据类型
# Go语言的基础数据类型 #
***
Go语言的数据类型主要分为四种:基础类型(数字,字符串,布尔类型),复合类型(数组,结构体),引用类型(指针,切片,字典,函数和通道),接口类型</font>
***
##整型
Go 语言的整型定义类型有符号类型主要有**int8,int16,int32,int64**, 无符号类型**uint8,uint16,uint32,uint64. int 和uint 是对应硬件平台分别对应不同的位数。以及uintptr**
<table class="table table-bordered table-striped table-condensed">
<tr>
<td>类型</td>
<td>有无符号</td>
<td>bit数</td>
</tr>
<tr>
<td>int8</td>
<td>yes</td>
<td>8</td>
</tr>
<tr>
<td>int16</td>
<td>yes</td>
<td>16</td>
</tr>
<tr>
<td>int32</td>
<td>yes</td>
<td>32</td>
</tr>
<tr>
<td>int64</td>
<td>yes</td>
<td>64</td>
</tr>
<tr>
<td>uint8</td>
<td>no</td>
<td>8</td>
</tr>
<tr>
<td>uint16</td>
<td>no</td>
<td>16</td>
</tr>
<tr>
<td>uint32</td>
<td>no</td>
<td>32</td>
</tr>
<tr>
<td>uint64</td>
<td>no</td>
<td>64</td>
</tr>
<tr>
<td>int</td>
<td>yes</td>
<td>等于cpu位数</td>
</tr>
<tr>
<td>uint</td>
<td>no</td>
<td>等于CPU的位数</td>
</tr>
<tr>
<td>byte</td>
<td>no</td>
<td>等于uint8</td>
</tr>
<tr>
<td>rune</td>
<td>yes</td>
<td>等同于int32</td>
</tr>
<tr>
<td>uintptr</td>
<td>no</td>
<td>-</td>
</tr>
</table>
Go语言的Bit操作符主要有以下几种:
& 位运算 AND
| 位运算 OR
^ 位运算 XOR
&^ 位清空 (AND NOT)
<< 左移
>> 右移
这些操作符大部分和C语言的没什么不同,在这里说一下&^这个运算符是&和^的结合
x &^ y
这里的意思就是y为1的位都为0,然后其余的和x一样。也就是先执行了^y操作然后 &x。
##浮点型
1. 浮点数表示:
Go语言定义了两个类型float32和float64,其中float32等价于C语言的float类型,
float64等价于C语言的double类型。
在这里普及一下float在内存中的存储方式
float
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
float的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字。
不懂的可以参照
[http://blog.csdn.net/flowaway_/article/details/41597727](http://blog.csdn.net/flowaway_/article/details/41597727)
然后GO圣经的这个代码:
var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1) // "true"!
为什么f == f+1,其实就是精度的问题,大家可以测试一下f+3和f+4的结果应该也是一样的,对于要舍弃的第一位(大于23位的第一位如果是1是要进位到前面去的)。
对于浮点型的比较因为是不精确的,所以不能使用==,可以使用下面的代码
import "math"
func Checkqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
p是用户自定义的精度,如:0.000001
***
##复数
复数由两部分组成,实部(real)和虚部(imag).Go 语言提供了complex64和complex128两种精度。
复数的表示:
var x complex64
x = 4 + 4i
y := 4 + 4i
z := complex(4,4)
在这里x代表是complex64类型, y,z都属于complex128类型。
对于复数,可以通过Go语言内置的real(x)和imag(x)来分别获取复数的实部和虚部。
***
##布尔类型
布尔类型和和C语言的没什么区别关键字bool,可以赋值true 和false 。这里不做其它讲述。
***
##字符串和Byte切片
字符串在任何语言里面都是一个很好用的东西。Go语言是直接支持原生的字符串类型。Go语言的字符串的操作感觉很像python里面的操作,看下面的字符串操作代码:
func StringFunc(s string) {
fmt.Printf("%c", s[0]) // 下标操作和传统的C一样
var f string = ",wenxuwan"
s = s + f //字符串连接,可以直接+链接两个字符串
fmt.Println(s[0:4]) //截断操作,打印0-3下表的字符串
fmt.Println(len(s)) //打印字符串的长度
}
var str string = "Hello,world"
StringFunc(str)
对于中文字符的,如果想获取到中文字符,可以先将string转换为rune数组,得到中文的Unicode,然后用string将Unicode转换为字符即可。
***
##常量
- 1
常量的关键字和C语言的一样,都是const表示:
const i = 3.1415926
const 同时支持批量声明
const(
a = 10
b
c =20
d
)
批量声明除了第一个必须赋值,其它的都可以省略。你如果打印a,b,c,d的值,结果是10,10,20,20。也就保持和上面的值一样。
- 2
这样看来其实const批量声明也没什么大的作用,因此我们需要来介绍iota(常量生成器),它和其它语言里面的enum是一样的作用
const(
first = iota
second
third
fourth
)
输出之后,结果应该是0,1,2,3。
在这里如果代码如下
const(
first = iota
second
third = 10
fourth
)
结果会是什么?
如果是这样,结果是什么?
const(
first = iota
second
third = 10
fourth = iota
)
大家可以通过这个来自己感受iota的使用
这里还有一种使用方法
const(
first = 1 << iota
second
third
fourth
)
结果大家测试一下。