go 语言入门——基础数据类型(一)

对于所有数据而言,都是由bit组成(二进制数据),但是这些数据在顶层还是可以进一步区分,比如:整型、浮点数、比特数组、内存地址等。这些数据可以组合成新的数据类型(例如map、slices等);也可以进一步表达更多的对象,如数据包、像素点等。
Go语言中的数据类型包括四类:基础数据类型(整型、浮点数、复数、布尔型、字符串、常量)、复合类型(数组、Slice、Map、结构体、JSON、文本和HTML模板)、引用类型和接口类型。

接下来将主要介绍基础数据类型
一、整型:
Go语言提供了有符号和无符号(一般采用补码形式体现)两类整型,其中,
有符号的包括:
int8(8bit、1字节,-128 ~ 127)
int16(16bit、2字节,-32768 ~ 32767)
int32(32bit、4字节,-2147483648 ~ 2147483647)
int64(64bit、8字节,-9223372036854775808 ~ 9223372036854775807)
无符号的包括:
uint8(8bit、1字节,0 ~ 255,uint8和byte类型等价)
uint16(16bit、2字节, 0 ~ 65535)
uint32(32bit、4字节,0 ~ 4294967295)
uint64(64bit、8字节,0 ~ 18446744073709551615)
一般而言,常用的有符号和无符号正数为int和uint,这两个都是32或64bit(不同的CPU平台会略有区别),但需要注意,int(uint)和int32(uint32)不是同一类型(虽然两者都是32位),两者需要做一个显示的类型转换操作。
这里还需要注意三种整型,byte、rune和uintptr:
btye:该类型是uint8类型的别名,等价于uint8,一般用于强调数值是一个原始数据而不是一个小的正数,例如在代表ASCII码时,就表示一个字符。

var ch byte = 'A'或 var ch byte = 65 或 var ch byte = '\x41'      //(\x 总是紧跟着长度为 2 的 16 进制数,所以\x41=65)

上述三种写法均是相同的.
rune:代表一个UTF-8字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
uintptr:一种整数类型,没有指定具体的大小,但是足够容纳一个指针的空间。其常用于底层编程。

二、浮点数
Go语言提供了两种精度的浮点数,float32和float64.一般浮点数的范围极限可以在math包汇中找到,math.MaxFloat32表示float32能表示的最大数,约为,math.MaxFloat64常量大约是。它们分别能表示的最小值近似为和。

三、复数
Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:

var x complex128 = complex(1, 2) // 1+2i
var y complex128 = complex(3, 4) // 3+4i
fmt.Println(x*y)                 // "(-5+10i)"
fmt.Println(real(x*y))           // "-5"
fmt.Println(imag(x*y))           // "10"

复数也可以用==和!=进行相等比较。只有两个复数的实部和虚部都相等的时候它们才是相等的(译注:浮点数的相等比较是危险的,需要特别小心处理精度问题)。

四、运算符
在Go语言中,关于数值(包括正数、浮点数和复数)的算术运算符、逻辑运算符和比较运算符,它们按照优先级(5种优先级)递减的顺序排列如下:

*      /      %      <<       >>     &       &^
+      -      |      ^
==     !=     <      <=       >      >=
&&
||

在同一优先级的二元运算符按照从左到右的顺序结合。且取模预算符%只能用于整数间,取模运算符的符号与被取模数的符号一致,如-5%3和-5%-3的结果都是-2。

当进行算术运算时,如果计算结果溢出(尤其是+、*)时,超出高位的bit位部分会被丢弃。同时需要注意,运算符的两端必须是相同类型的,否则会报出类型不匹配的错误。如:

var apples int32 = 1
var oranges int16 = 2
var compote int = apples + oranges       //编译错误 compile error
var compote = int(apples) + int(oranges) //正确写法

比较运算符(==、!=、<、<=、>、>=)的结果为bool类型

位运算符包括以下几种

&      位运算与  AND
|      位运算或  OR
^      位运算异或 XOR
&^     位清空 (AND NOT)
<<     左移
>>     右移

位运算符^作为二元运算符时表示按位异或(XOR),作为一元运算符时表示按位取反;位操作运算符&^用于按位置零(AND NOT):如果对应y中bit位为1的话, 表达式z = x &^ y结果z的对应的bit位为0,否则z对应的bit位等于x相应的bit位的值。

    var x uint8 =1
    fmt.Printf("%08b\n", x)    //"00000001"
    x = 1<<1 | 1<<5            //00000010|00100000
    fmt.Printf("%08b\n", x)    //"00100010"
    var y uint8 = 1<<1 |1<<2
    fmt.Printf("%08b\n", y)    //"00000110"

    fmt.Printf("%08b\n", x&y)  // "00000010", the intersection {1}
    fmt.Printf("%08b\n", x|y)  // "00100110", the union {1, 2, 5}
    fmt.Printf("%08b\n", x^y)  // "00100100", the symmetric difference {2, 5}
    fmt.Printf("%08b\n", x&^y) // "00100000", the difference {5}

    fmt.Printf("%08b\n", x<<1) // "01000100", the set {2, 6}
    fmt.Printf("%08b\n", x>>1) // "00010001", the set {0, 4}
    fmt.Printf("%08b\n", ^x)   //"11011101"

在进行移位操作时,左移操作<<(x<>(x>>2)可以等价于除以

五、fmt使用技巧
在使用fmt打印的时候,除了需要注意,可以用%d、%o或%x参数控制输出的进制格式,就像下面的例子:

o := 0666
fmt.Printf("%d %[1]o %#[1]o\n", o) // "438 666 0666"
x := int64(0xdeadbeef)
fmt.Printf("%d %[1]x %#[1]x %#[1]X\n", x)
// Output:
// 3735928559 deadbeef 0xdeadbeef 0XDEADBEEF

fmt的Printf格式化字符串输出还有两个技巧:
1、当需要输出多个相同的变量是可以用%[]替换,如%[1]表示Printf函数可以再次使用第一个操作数
2、%后的#副词告诉Printf在用%o、%x或%X输出时生成0、0x或0X前缀。

\\字符使用%c参数打印,或者是用%q参数打印带单引号的字符:
ascii := 'a'
fmt.Printf("%d %[1]c %[1]q\n", ascii)   // "97 a 'a'"

你可能感兴趣的:(go 语言入门——基础数据类型(一))