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能表示的最大数,约为3.4e38,math.MaxFloat64常量大约是1.8e308。它们分别能表示的最小值近似为1.4e-454.9e-324

三、复数
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<<n)可以等价于乘以2^n,右移运算符>>(x>>2)可以等价于除以2^n

五、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'"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,865评论 6 518
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,296评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 169,631评论 0 364
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,199评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,196评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,793评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,221评论 3 423
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,174评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,699评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,770评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,918评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,573评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,255评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,749评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,862评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,364评论 3 379
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,926评论 2 361

推荐阅读更多精彩内容