04 Golang数据类型

分类

Go语言中的数据类型分为:基本数据类型和复合数据类型

  • 基本数据类型

整型、浮点型、布尔型、字符串

  • 复合数据类型

数组、切片、结构体、函数、map、通道(channel)、接口等

整型

整型分为以下两个大类:

  1. 有符号整型按长度分:int8、int16、int32、int64
  2. 对应的无符号整型:uint8、uint16、uint32、uint64
  • 定义int类型

默认值为空

var num int = 10
fmt.Printf("num=%v 类型:%T",num, num)
//num=10 类型:int

默认的int类型长度跟随操作系统32/64位而变化

类型 范围 占用空间
int8 -127~128 1B
int16 -32768~32767 2B
int32 -231~231-1 4B
int64 -263~263-1 8B
  • 不同长度的int之间的转换
var a1 int32 = 10
var a2 int64 = 21
fmt.Println(a1 + a2)
//报错,int32和int64为不同类型,不能直接参与运算
fmt.Println(int64(a1) + a2)

高位向底位转换时是直接截取,要注意数值符号

byte和rune类型
  1. uint8类型,或者叫byte型,代表了ASCII的一个字符
  2. rune类型,代表一个UTF-8字符。当需要处理中文、日文或其他复合字符时,需要用到rune类型。rune类型实际是一个int32
var a = 'a'
fmt.Printf("值:%v 类型:%T")
//值:97 类型:int32
fmt.Printf("值:%v 类型:%T")
//值:a 类型:int32

在Go中一个字母占用1个字节,一个汉字占用3个字节(utf-8编码)

var str = "this"
fmt.Println(unsafe.Sizeof(str), len(str))
//16 4

这里不管str的内容是多少,Sizeof始终打印16,与他的内存结构有关;要查看他真实长度的时候,可以用len()方法

Sizeof

查看不同的数据类型,在内存中占用的存储空间(无法查看string类型)

var num int8 = 15
fmt.Println(unsafe.Sizeof(num))
//1
浮点型(与C基本相同)

Go支持两种浮点数:float32和float64,四舍五入保留6位小数,分别占用4B和8B

var num float32 = 3.12
fmt.Println(unsafe.Sizeof(num))//4
var c float64 = 3.14159255
fmt.Printf("%v-%f", c, c)
//3.14159255-3.141592
fmt.Printf("%.2f")
//保留两位小数3.14

Go语言中默认浮点数为float64

  • 科学计数法表示浮点类型

3.14e 表示3.14*102

  • float精度丢失问题

几乎所有的编程语言都有精度丢失的问题,这是典型的二进制浮点数精度损失问题。在定长条件下,二进制小数和十进制小数互转可能有精度丢失。

var num float64 = 1129.6
fmt.Println(num*100)
//112529.9999999999

可以使用第三方包来解决精度损失问题
https://github.com/shopspring/decimal

import(
    "fmt"
    "github.com/shopspring/decimal"
)
func main(){
    m1 := 8.2
    m2 := 3.8
    res := decimal.NewFromFloat(m1).Sub(decimal.NewFromFloat(m2))
    fmt.Println(res)
}
  • int与float之间的转换

int => float

a := 10
b := float64(a)
fmt.Printf("a的类型是%T,b的类型是%T", a, b)
//a的类型是int,b的类型是float
var a1 float32 = 23.4
a2 := float64(a1)
//a1是float32,a2是float64

float => int会直接截取,丢失数据(不建议)

布尔型数据
  1. 布尔型变量默认为false
  2. Go语言中不允许将整型强制转换为布尔型
  3. 布尔型无法参与数值运算,也无法与其他类型转换
字符串

默认值为空,用双引号""包裹值

  • 字符串转义字符
转义符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\' 单引号
\" 双引号
\\ 反斜杠
  • 多行字符串(JS中ES6的模板字符串)
    str := `this
    is
    str
    `
    fmt.Println(str)
  • 字符串的常用操作
方法 说明
len(str) 求长度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判断是否包含
strings.HasPrefix, strings, HasSuffix 前缀/后缀判断
strings.Index(), strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) 切片转字符串
var str1 = "aaa"
var str2 = "哈喽"
var str3 = "123-456-789"
fmt.Println(len(str1), len(str2))//4 6
fmt.Sprintf("%v %v", str1, str2)//aaa 哈喽

arr := strings.Split(str,"-")
fmt.Println(arr)//切片[123 456 789]
fmt.Println(strings.Join(arr, "-"))//123-456-789

newArr := []string{"php","JavaScript","golang"}
fmt.Pringln(string.Join(newArr))//[php JavaScript golang]

str10 := "this is str"
str11 := "this"
flag := strings.Contains(str10, str11)
//判断str10中是否包含true

fmt.Println("strings.HasPrefix(str10, str11)")//判断str1是否以str2开头
fmt.Println("strings.HasSuffix(str10, str11)")//判断str2是否以str2结尾

fmt.Println(strings.Index(str10, str11))
//判断str11在str10中首次出现的位置 0
fmt.Println(strings.LastIndex(str10, "is"))
//判断str11在str10中最后出现的位置(位置始终按照从左往右计算)5

  • 循环遍历字符串
s := "hello"
for i :=0; i < len(s); i++ {//byte
    fmt.Printf("%v(%c)", s[i], s[i])
}
fmt.Println()
//打印有问题,因为一个汉字占用了3个字节
for _,r := range s {//rune
    fmt.Printf("%v(%c)", r, r)
}
  • 修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

s1 := "big"
byteS1 := []byte(s1)
byteS1[0] = "p"
fmt.Println(string(byteS1))//pig
s2 := "胡萝卜"
runeS2 := []rune(s2)
runeS2[0] = '白'
fmt.Println(string(runeS2))//白萝卜
  • sprintf

string=>other. sprintf使用中需要注意转换的格式

int为%d float为%f bool为%t byte为%c

var i int = 20
var f float64 = 12.456
var t tool = true
var b byte = 'a'
str := fmt.Sprintf("%d", i)
fmt.Printf("%v%T", str, str)//20string
str2 := fmt.Sprintf("%.2f", f)
fmt.Printf("%v%T", str2, str2)//12.46string
str3 := fmt.Sprintf("t", f)
fmt.Printf("%v %T", str3, str3)//true string
str4 := fmt.Sprintf("%c", b)
fmt.Printf("%v %T")//a string
  • ParseInt(string数据,进制,位数)

ParseInt方法有两个返回值,一个是转换的结果,一个是返回的错误信息

str := "123456"
fmt.Printf("%v%T\n", str, str)
num, _ := strconv.ParseInt(str, 10, 64)
fmt.Printf("%v%T",num, num)//123456 int64
  • ParseFloat(string数据,位数)
str := 123.456
num, _ := strconv.ParseFloat(str, 64)//123.456 float64
  • strconv包

其他类型转string类型

1.int=>string: 该方法中接收两个参数,参数1:int64的数值;参数2:当前int类型的进制

var i int = 20
str1 := strconv.FormatInt(int64(i), 10)
fmt.Printf("%v%T", str1, str1)//20string
var f float = 20.32
str2 := strconf.FormatFloat
  1. float=>string: 接收四个参数
    参数1:传入的值;
    参数2:格式化的方式 'f'(-ddd.dddd)……;
    参数3:保留的小数点(-1表示不对小数点格式化);
    参数4:格式化的类型(传入64/32)
var f float32 = 3.141592
str := strconv.FormatFloat(float64(f), 'f', 4, 64)
fmt.Printf("%v%T", str, str)//3.1416 string
  1. bool=>string
str := strconv.FormatBool(true)
fmt.Printf("%v%T", str, str)//true string

数值型无法和bool类型转换

  1. 字符=>string
a := 'b'
str := strconv.FormatUint(uint64(a), 10)
fmt.Printf("%v%T", str, str)//98 string
自定义类型和类型别名
//自定义类型
type myInt int
//类型别名
type myFloat  = float64

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

推荐阅读更多精彩内容