04 Golang數(shù)據(jù)類型

分類

Go語(yǔ)言中的數(shù)據(jù)類型分為:基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型

  • 基本數(shù)據(jù)類型

整型、浮點(diǎn)型、布爾型羊苟、字符串

  • 復(fù)合數(shù)據(jù)類型

數(shù)組、切片哎迄、結(jié)構(gòu)體、函數(shù)隆圆、map漱挚、通道(channel)、接口等

整型

整型分為以下兩個(gè)大類:

  1. 有符號(hào)整型按長(zhǎng)度分:int8渺氧、int16旨涝、int32、int64
  2. 對(duì)應(yīng)的無符號(hào)整型:uint8侣背、uint16白华、uint32、uint64
  • 定義int類型

默認(rèn)值為空

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

默認(rèn)的int類型長(zhǎng)度跟隨操作系統(tǒng)32/64位而變化

類型 范圍 占用空間
int8 -127~128 1B
int16 -32768~32767 2B
int32 -231~231-1 4B
int64 -263~263-1 8B
  • 不同長(zhǎng)度的int之間的轉(zhuǎn)換
var a1 int32 = 10
var a2 int64 = 21
fmt.Println(a1 + a2)
//報(bào)錯(cuò)贩耐,int32和int64為不同類型弧腥,不能直接參與運(yùn)算
fmt.Println(int64(a1) + a2)

高位向底位轉(zhuǎn)換時(shí)是直接截取,要注意數(shù)值符號(hào)

byte和rune類型
  1. uint8類型潮太,或者叫byte型管搪,代表了ASCII的一個(gè)字符
  2. rune類型,代表一個(gè)UTF-8字符铡买。當(dāng)需要處理中文更鲁、日文或其他復(fù)合字符時(shí),需要用到rune類型寻狂。rune類型實(shí)際是一個(gè)int32
var a = 'a'
fmt.Printf("值:%v 類型:%T")
//值:97 類型:int32
fmt.Printf("值:%v 類型:%T")
//值:a 類型:int32

在Go中一個(gè)字母占用1個(gè)字節(jié)岁经,一個(gè)漢字占用3個(gè)字節(jié)(utf-8編碼)

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

這里不管str的內(nèi)容是多少朋沮,Sizeof始終打印16蛇券,與他的內(nèi)存結(jié)構(gòu)有關(guān);要查看他真實(shí)長(zhǎng)度的時(shí)候樊拓,可以用len()方法

Sizeof

查看不同的數(shù)據(jù)類型纠亚,在內(nèi)存中占用的存儲(chǔ)空間(無法查看string類型)

var num int8 = 15
fmt.Println(unsafe.Sizeof(num))
//1
浮點(diǎn)型(與C基本相同)

Go支持兩種浮點(diǎn)數(shù):float32和float64,四舍五入保留6位小數(shù)筋夏,分別占用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")
//保留兩位小數(shù)3.14

Go語(yǔ)言中默認(rèn)浮點(diǎn)數(shù)為float64

  • 科學(xué)計(jì)數(shù)法表示浮點(diǎn)類型

3.14e 表示3.14*102

  • float精度丟失問題

幾乎所有的編程語(yǔ)言都有精度丟失的問題蒂胞,這是典型的二進(jìn)制浮點(diǎn)數(shù)精度損失問題。在定長(zhǎng)條件下条篷,二進(jìn)制小數(shù)和十進(jìn)制小數(shù)互轉(zhuǎn)可能有精度丟失骗随。

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之間的轉(zhuǎn)換

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會(huì)直接截取,丟失數(shù)據(jù)(不建議)

布爾型數(shù)據(jù)
  1. 布爾型變量默認(rèn)為false
  2. Go語(yǔ)言中不允許將整型強(qiáng)制轉(zhuǎn)換為布爾型
  3. 布爾型無法參與數(shù)值運(yùn)算鸿染,也無法與其他類型轉(zhuǎn)換
字符串

默認(rèn)值為空指蚜,用雙引號(hào)""包裹值

  • 字符串轉(zhuǎn)義字符
轉(zhuǎn)義符 含義
\r 回車符(返回行首)
\n 換行符(直接跳到下一行的同列位置)
\t 制表符
\' 單引號(hào)
\" 雙引號(hào)
\\ 反斜杠
  • 多行字符串(JS中ES6的模板字符串)
    str := `this
    is
    str
    `
    fmt.Println(str)
  • 字符串的常用操作
方法 說明
len(str) 求長(zhǎng)度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判斷是否包含
strings.HasPrefix, strings, HasSuffix 前綴/后綴判斷
strings.Index(), strings.LastIndex() 子串出現(xiàn)的位置
strings.Join(a[]string, sep string) 切片轉(zhuǎn)字符串
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結(jié)尾

fmt.Println(strings.Index(str10, str11))
//判斷str11在str10中首次出現(xiàn)的位置 0
fmt.Println(strings.LastIndex(str10, "is"))
//判斷str11在str10中最后出現(xiàn)的位置(位置始終按照從左往右計(jì)算)5

  • 循環(huán)遍歷字符串
s := "hello"
for i :=0; i < len(s); i++ {//byte
    fmt.Printf("%v(%c)", s[i], s[i])
}
fmt.Println()
//打印有問題,因?yàn)橐粋€(gè)漢字占用了3個(gè)字節(jié)
for _,r := range s {//rune
    fmt.Printf("%v(%c)", r, r)
}
  • 修改字符串

要修改字符串涨椒,需要先將其轉(zhuǎn)換成[]rune或[]byte摊鸡,完成后再轉(zhuǎn)換為string。無論哪種轉(zhuǎn)換蚕冬,都會(huì)重新分配內(nèi)存免猾,并復(fù)制字節(jié)數(shù)組。

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使用中需要注意轉(zhuǎn)換的格式

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數(shù)據(jù),進(jìn)制囤热,位數(shù))

ParseInt方法有兩個(gè)返回值猎提,一個(gè)是轉(zhuǎn)換的結(jié)果,一個(gè)是返回的錯(cuò)誤信息

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數(shù)據(jù),位數(shù))
str := 123.456
num, _ := strconv.ParseFloat(str, 64)//123.456 float64
  • strconv包

其他類型轉(zhuǎn)string類型

1.int=>string: 該方法中接收兩個(gè)參數(shù)旁蔼,參數(shù)1:int64的數(shù)值忧侧;參數(shù)2:當(dāng)前int類型的進(jìn)制

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: 接收四個(gè)參數(shù)
    參數(shù)1:傳入的值;
    參數(shù)2:格式化的方式 'f'(-ddd.dddd)……牌芋;
    參數(shù)3:保留的小數(shù)點(diǎn)(-1表示不對(duì)小數(shù)點(diǎn)格式化)蚓炬;
    參數(shù)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

數(shù)值型無法和bool類型轉(zhuǎn)換

  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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市躺屁,隨后出現(xiàn)的幾起案子肯夏,更是在濱河造成了極大的恐慌,老刑警劉巖犀暑,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驯击,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耐亏,警方通過查閱死者的電腦和手機(jī)徊都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來广辰,“玉大人暇矫,你說我怎么就攤上這事≡竦酰” “怎么了李根?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)几睛。 經(jīng)常有香客問我房轿,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任囱持,我火速辦了婚禮夯接,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纷妆。我一直安慰自己钻蹬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布凭需。 她就那樣靜靜地躺著问欠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粒蜈。 梳的紋絲不亂的頭發(fā)上顺献,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音枯怖,去河邊找鬼注整。 笑死,一個(gè)胖子當(dāng)著我的面吹牛度硝,可吹牛的內(nèi)容都是我干的肿轨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蕊程,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椒袍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藻茂,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤驹暑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辨赐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體优俘,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年掀序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帆焕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡不恭,死狀恐怖叶雹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情县袱,我是刑警寧澤浑娜,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站式散,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏打颤。R本人自食惡果不足惜暴拄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一漓滔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乖篷,春花似錦响驴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鲸沮,卻和暖如春琳骡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讼溺。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工楣号, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怒坯。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓炫狱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剔猿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子视译,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容