Go语言基础之数据类型

首先贴出来Go语言官方文档的类型章节,方便随时查阅。

对比PHP语言,Go语言中数据类型就比较丰富了,除了整型、浮点型、布尔型、字符串、数组外,还有切片、结构体、函数、map、通道(channel)等。
go语言的数据类型可以分为2个大类:
基础数据类型:布尔(bool),数值(整型、浮点),字符串(string)
复合数据类型:数组(array),切片(slice),结构体(struct)、函数(function)、集合(map)、通道(channel)、指针(pointer)、接口(interface)

基础数据类型

布尔类型

默认值:false
布尔类型就没有什么好说的了,跟其他语言也都一样,只能是常量true和false。
与PHP不一样的是,Go语言中布尔类型比较孤立,不能与其他类型转换,比如不能把布尔类型转换成整型0和1,也不能将整型转换成布尔,既然不能转换成整型,那很自然也就不能参与数值运算了,比如+,-等等。

数值类型

整型

整型可以分为两个大类:有符号位和无符号位,有符号位对应的是int8、int16、int32、int64,无符号位对应的是uint8、uint16、uint32、uint64。
int、uint 是基于架构的,如果我们的架构是32位的,int的长度就相当于int32,uint同理。
uintptr是用于存放指针的,但是从数据类型来说是属于整型,即使uintptr类型的变量仍然有效,由uintptr类型的变量表示的指针地址的数据也可能被GC回收。
所以我们选择整型数据类型时,根据需要存储的数值长度和有符号无符号来选择就好了。

Go语言中无法直接定义二进制数,但是可以定义八进制和十六进制的数。
注意看下面的代码,定义八进制和十六进制实际上也是整型。
我们在代码里面通常不会用到这些八进制、十六进制的数,一般就给文件定义权限会用到八进制的数,十六进制的数是涉及到内存地址的时候。

package main

import "fmt"

func main() {
    // 十进制
    var i1 int = 10
    // 八进制 以0开头
    var i2 int = 012
    // 十六进制 以0x开头
    var i3 int = 0xa

    fmt.Printf("十进制数10转换--  十进制:%d,八进制:%o,十六进制:%x\n",i1,i1,i1)
    fmt.Printf("八进制数012转换-- 十进制:%d,八进制:%o,十六进制:%x\n",i2,i2,i2)
    fmt.Printf("十六进制0xa转换-- 十进制:%d,八进制:%o,十六进制:%x\n",i3,i3,i3)

}
D:\go\src\day01>go run main.go
十进制数10转换--  十进制:10,八进制:12,十六进制:a
八进制数012转换-- 十进制:10,八进制:12,十六进制:a
十六进制0xa转换-- 十进制:10,八进制:12,十六进制:a


浮点

Go语言中浮点类型有float32float64,区别是最大值不一样,
通过类型推导定义变量时,如f := 1.1,默认是float64类型。
还有个复数complex64complex128类型也属于浮点类型,但代码中不常见,一般是做科学计算用的,暂时不需要过多了解。

字符串

Go语言中的字符串内部实现使用UTF-8编码,可以使用双引号""和反引号``定义值的内容。
区别是双引号中可以使用转义符“\”反斜线,而反引号不支持转义符。可以暂时理解为反引号就相当于PHP中的单引号。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    // 双引号定义字符串:其中有"\t"制表符“需要转义,并且有“\n”换行符
    s1 := "\t黄翠刚\n你好!"
    // 反引号定义字符串:演示一下反引号不会转义字符
    s2 := `\t黄翠刚\n你好!`
    // 反引号定义字符串:演示一下与s1变量一样的字符串
    s3 := ` 黄翠刚
你好!`
    fmt.Printf("这是s1变量的值:\n%v\n这是s2变量的值:\n%v\n这是s3变量的值:\n%v\n",s1,s2,s3)

    // 字符串相关操作

    // 从字符串中提取所有的中文
    ss := regexp.MustCompile("[\u4e00-\u9fa5]").FindAllStringSubmatch(s1, -1)
    fmt.Printf("从字符串中提取所有的中文:%#v\n", ss)
    fmt.Println("从字符串中提取所有的中文统计字数:",len(ss))

    // 获取字符串的长度
    fmt.Println(len(s1))
    // 字符串拼接
    s4 := "黄翠刚"
    s5 := "你好!"
    s6 := s5 + s4
    fmt.Println(s6)
    // 字符串拼接
    // (fmt包Print系列的方法是输出到终端,而Sprint系列的方法是返回值,
    // 简单字符串拼接可以使用"+"加号,复杂格式化的字符串拼接建议用fmt包Print系列的方法)
    s7 := fmt.Sprintf("%v%v",s5,s4)
    fmt.Println(s7)

    // 字符串分割
    // (fmt包的Split系列方法是用于处理字符串分割的,返回[]string,
    // 我们定义的s8字符串当中实际是有\n换行符的,所以分割出来的结果是一行一行的字符串)
    s8 := `今天天气真好!
但是我昨晚没有睡好,今天状态不佳!`
    s9 := strings.Split(s8,`\n`)
    fmt.Printf("%T,%v\n",s9,s9)

    // 字符串拼接
    // s9是s8拆分出来的,我们这里又使用相同的字符串拼接,实际上拼接出来的字符串就是与s8拆分前的原始字符串相同了
    s10 := strings.Join(s9,`\n`)
    fmt.Println(s10)

    // 判断字符串中是否存在指定的字符,返回true|false 此处为true
    fmt.Println(strings.Contains(s8,`!`))

    // 判断字符串前缀是否匹配,返回true|false 此处为true
    fmt.Println(strings.HasPrefix(s8,`今天`))
    // 判断字符串后缀是否匹配,返回true|false 此处为false
    fmt.Println(strings.HasSuffix(s8,`状态不佳`))

    // 获取字符串首次出现的索引位置
    fmt.Println(strings.Index(s8, `气`))
    // 获取字符串最后一次出现的索引位置
    fmt.Println(strings.LastIndex(s8, `今`))
}

D:\go\src\day01>go run main.go
这是s1变量的值:
        黄翠刚
你好!
这是s2变量的值:
\t黄翠刚\n你好!
这是s3变量的值:
        黄翠刚
你好!
从字符串中提取所有的中文:[][]string{[]string{"黄"}, []string{"翠"}, []string{"刚"}, []string{"你"}, []string{"好"}}
从字符串中提取所有的中文统计字数: 5
20
你好!黄翠刚
你好!黄翠刚
[]string,[今天天气真好!
但是我昨晚没有睡好,今天状态不佳!]
今天天气真好!
但是我昨晚没有睡好,今天状态不佳!
true
true
false
9
48
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容