這篇文章主要講解了“Golang中常用的基本數(shù)據(jù)類型有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Golang中常用的基本數(shù)據(jù)類型有哪些”吧!
創(chuàng)新互聯(lián)公司是一家專業(yè)提供安平企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為安平眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
Golang 是一種強(qiáng)類型語(yǔ)言,變量使用時(shí)需要進(jìn)行強(qiáng)制類型定義,一旦某一個(gè)變量被定義,如果不經(jīng)強(qiáng)制轉(zhuǎn)換,那么它永遠(yuǎn)就是該類型。
Golang 推薦使用駝峰式命名,如 QuoteRuneToASCII 和 parseRequestLine 等。
定義變量的幾種形式:
// 第一種,先聲明類型,再進(jìn)行初始化賦值 // 如果沒(méi)有初始化,則變量默認(rèn)為零值。 var a int a = 3 // 第二種, 根據(jù)賦值自動(dòng)適配類型 b := 3 // 這種寫(xiě)法只能在函數(shù)體中出現(xiàn) // 效果等價(jià)于 var b = 3, 但后者可以在函數(shù)體之外的地方使用 // 第三種,聲明類型的同時(shí)進(jìn)行賦值 var c int = 3 // 第四種,使用 new 創(chuàng)建變量,然后返回變量的地址,類型為 *type p := new(int) *p = 3 // 與 python 相同,交換兩個(gè)變量的值,可以使用 a, b = b, a // 但與 python 不同的是兩個(gè)變量的類型必須是相同的。
注意:
Golang 中不允許出現(xiàn)未使用的變量,否則會(huì)報(bào)錯(cuò) a declared and not used。但是全局變量是允許聲明但不使用。
Golang 的封裝性由變量名第一個(gè)字母決定,大寫(xiě)字母開(kāi)頭的變量是可導(dǎo)出的變量,可以在包外使用,小寫(xiě)字母或者下劃線開(kāi)頭的變量只能在本包內(nèi)使用。
“:=” 是一個(gè)變量聲明語(yǔ)句,而 “=‘ 是一個(gè)變量賦值操作,一行中簡(jiǎn)短聲明多個(gè)變量時(shí),":=" 語(yǔ)句中必須至少要聲明一個(gè)新的變量。
獲取元素類型
// 方法一,創(chuàng)建 reflect 變量 import "reflect" var a int typeOfA := reflect.TypeOf(a) fmt.Println(typeOfA) // 或者直接 fmt.Println(reflect.TypeOf(a)) // 方法二,使用 fmt 查看 import "fmt" var a int fmt.Printf("%T", a) // 注意不能用 Println
整型
數(shù)字表示類型的比特長(zhǎng)度,不同長(zhǎng)度的類型是獨(dú)立的,混合計(jì)算會(huì)報(bào)錯(cuò)
int 的長(zhǎng)度由硬件決定:
數(shù)據(jù)類型 | 計(jì)算機(jī)架構(gòu) | 比特寬度 | 字節(jié)寬度 |
---|---|---|---|
int | 32位 | 32 | 4 |
int | 64位 | 64 | 8 |
uint | 32位 | 32 | 4 |
uint | 64位 | 64 | 8 |
也可以指定 int 的固定長(zhǎng)度類型:
數(shù)據(jù)類型 | 比特寬度 |
---|---|
int8 | 8 |
int16 | 16 |
int32 (rune, 可以用來(lái)表示一個(gè) Unicode 字符) | 32 |
int64 | 64 |
uint8 (byte) | 8 |
uint16 | 16 |
uint32 | 32 |
uint64 | 64 |
浮點(diǎn)類型
Golang 支持兩種浮點(diǎn)型數(shù)值:float32 和 float64??梢允褂?math 包中的常量獲取浮點(diǎn)類型的邊界值
const ( MaxFloat32 = 3.40282346638528859811704183484516925440e+38 // 2**127 * (2**24 - 1) / 2**23 SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23) MaxFloat64 = 1.797693134862315708145274237317043567981e+308 // 2**1023 * (2**53 - 1) / 2**52 SmallestNonzeroFloat64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52) )
注意:浮點(diǎn)類型有精度限制,計(jì)算結(jié)果不準(zhǔn)確,不推薦使用
需要進(jìn)行浮點(diǎn)計(jì)算時(shí),可以使用放大 100 倍的整數(shù)計(jì)算,計(jì)算完成再將結(jié)果縮小 100 倍
復(fù)數(shù)
Golang 自帶了復(fù)數(shù)類型,分別為 complex64, complex128,定義時(shí)需要制定實(shí)部和虛部,如:
var c1, c2 complex64 c1 = 1 + 2i c2 = 2 + 3i fmt.Println(c1 + c2) // out: 3 + 5i
布爾
bool 類型,有 true 和 false 兩種類型,要注意的是,和 python 不同,Golang 不會(huì)自動(dòng)對(duì)變量識(shí)別 true or false,因此 if 1 這種方式是會(huì)報(bào)錯(cuò)的
錯(cuò)誤
error,error 實(shí)際上是一種接口類型,后續(xù)會(huì)單獨(dú)介紹,可以先參考官網(wǎng)文檔 error document
字符
rune, byte 可用于表示單個(gè)字符,字符串,rune 數(shù)組,byte 數(shù)組之間可以相互轉(zhuǎn)換,讓我們從源碼看看 byte 和 rune 的區(qū)別:
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned // integer values. type byte = uint8 // rune is an alias for int32 and is equivalent to int32 in all ways. It is // used, by convention, to distinguish character values from integer values. type rune = int32
可以看出,byte 為 1 字節(jié)的 uint8 數(shù)值,rune 為 4 字節(jié)的 int32 數(shù)值,通過(guò)下面的代碼,可以看出一個(gè)中文字符占了三個(gè)字節(jié),在 []byte{} 中長(zhǎng)度為 3,string 和 []byte{} 的長(zhǎng)度相等,string 實(shí)際上就是由 byte 數(shù)組實(shí)現(xiàn)的。
a := "測(cè)試T" aRune := []rune(a) aByte := []byte(a) fmt.Println(a, aRune, aByte) fmt.Println(len(a), len(aRune), len(aByte)) // output: // 測(cè)試T [27979 35797 84] [230 181 139 232 175 149 84] // 7 3 7
字符串
string 類型,與 python 不同,go 的字符串只能用 “” 或者 原始字符串引號(hào) ``(重音符號(hào))
// 普通字符串 s1 := "hello\nworld" // 里面的 \n 會(huì)被轉(zhuǎn)義為回車 // 原始字符串,相當(dāng)于 python 中在字符串前面加 r s2 := `hello\nworld` // 所有內(nèi)容都是字符,不會(huì)被轉(zhuǎn)義
字符串是不可修改的,對(duì)字符串進(jìn)行修改操作時(shí),會(huì)創(chuàng)建一個(gè)新的字符串賦值給當(dāng)前字符串
s := "hello" s += " world" // 這樣不會(huì)報(bào)錯(cuò),會(huì)把 "hello world" 整個(gè)重新分配給 s s[0] = "a" // 這樣寫(xiě)就會(huì)報(bào)錯(cuò)
因此,如果涉及到大批量的字符串拼接或者修改的操作,效率會(huì)很低且耗費(fèi)資源,推薦使用 bytes 包的 Buffer 來(lái)進(jìn)行操作
import "bytes" bs := bytes.NewBufferString("") bs.WriteString("hello ") bs.WriteString("world") s := bs.String() // out: hello world
更多內(nèi)容可查看官網(wǎng)文檔 bytes document
字符串常用操作
獲取字符串長(zhǎng)度
字符串本質(zhì)上是字符數(shù)組,所以可以使用 len(s) 獲取長(zhǎng)度。
要注意的是對(duì)用戶名等可能包含中文或其他字符的字符串進(jìn)行判斷時(shí),使用 utf8 長(zhǎng)度判斷而不是 len() 判斷,否則識(shí)別出來(lái)的長(zhǎng)度是不正確的
fmt.Println(len("測(cè)試")) // 6 fmt.Println(utf8.RuneCountInString("測(cè)試")) // 2 fmt.Println(utf8.RuneCountInString("混合測(cè)試,fight!")) // 11
數(shù)值和字符串的相互轉(zhuǎn)換
int 轉(zhuǎn)換為 string
int 轉(zhuǎn)換為 string 不能直接 string(i),這樣轉(zhuǎn)完會(huì)變成空值
s := strconv.Itoa(i)
int64 轉(zhuǎn)換為 string
var i64 int64s := strconv.FormatInt(i64,10) // 第二個(gè)參數(shù)為基數(shù)(2~36),如十進(jìn)制二進(jìn)制等
string 轉(zhuǎn)換為 int 型
使用非數(shù)值的字符串轉(zhuǎn)換為數(shù)值時(shí)會(huì)發(fā)生錯(cuò)誤,比如 “abc” 轉(zhuǎn)為數(shù)字或者使用空字符串,因此需要接收 error。
i, err := strconv.Atoi(s) if err != nil { return err }
string 轉(zhuǎn)換為 int64
//第二個(gè)參數(shù)為基數(shù)(2~36), //第三個(gè)參數(shù)位大小表示期望轉(zhuǎn)換的結(jié)果類型,其值可以為0, 8, 16, 32和64, //分別對(duì)應(yīng) int, int8, int16, int32和int64 i64, err := strconv.ParseInt(s, 10, 64)
string 和 slice 相互轉(zhuǎn)換
slice 轉(zhuǎn)換為 string
import "strings" sli := []string{"111","2222","333","4444"} ss := strings.Join(s,"--") // 輸出為 111--2222--333--4444
string 轉(zhuǎn)換為 slice
ss := "a,b,c" sli := strings.Split("a,b,c", ",")
字符串替換
使用 strings 包的 Replace 函數(shù)進(jìn)行字符串替換
// Replace // 如果最后一個(gè)參數(shù)為正整數(shù),表示將前 n 個(gè) old 替換為 new // 如果最后一個(gè)參數(shù)為負(fù)數(shù),一般為-1,表示全局替換,相當(dāng)于 ReplaceAll func Replace(s, old, new string, n int) string // 例: fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1)) // output: moo moo moo fmt.Println(strings.Replace("oink oink oink", "oink", "moo", 2)) // output: moo moo oink // ReplaceAll func ReplaceAll(s, old, new string) string
指針
如果用“var x int”聲明語(yǔ)句聲明一個(gè)x變量,那么 &x表達(dá)式(取x變量的內(nèi)存地址)將產(chǎn)生一個(gè)指向該整數(shù)變量的指針,指針對(duì)應(yīng)的數(shù)據(jù)類型是 *int ,指針被稱之為“指向int類型的指針”。同時(shí) *p表達(dá)式對(duì)應(yīng)p指針指向的變量的值。
x := 1 p := &x // p 為指向 x 的指針 /* 等價(jià)于: var p *int p = &x */ fmt.Println(*p) // 輸出 1 *p = 2 // 修改 *p 指向?qū)ο蟮闹? fmt.Println(x) // 輸出 2
任何類型的指針的零值都是 nil。如果 p != nil測(cè)試為真,那么 p 是指向某個(gè)有效變量。指針之間也是可以進(jìn)行相等測(cè)試的,只有當(dāng)它們指向同一個(gè)變量或全部是nil時(shí)才相等。
自定義類型
type 類型名字 底層類型
這種操作的意義在于賦予相同基本類型(比如 float64)的變量不同的含義,比如華氏溫度和攝氏溫度,這兩種溫度被定義成不同的數(shù)據(jù)類型,可以避免混用不同的溫度單位,產(chǎn)生錯(cuò)誤的計(jì)算結(jié)果。
// Package tempconv performs Celsius and Fahrenheit temperature computations. package tempconv import "fmt" type Celsius float64 // 攝氏溫度 type Fahrenheit float64 // 華氏溫度 const ( AbsoluteZeroC Celsius = -273.15 // 絕對(duì)零度 FreezingC Celsius = 0 // 結(jié)冰點(diǎn)溫度 BoilingC Celsius = 100 // 沸水溫度 ) func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) } func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }
常量
go 使用 const創(chuàng)建常量,它們?cè)诰幾g時(shí)被創(chuàng)建,只能是數(shù)字、字符串或布爾
值。
// 常量用的是 = 而不是 := const x = 42
可以使用 iota生成枚舉值,第一個(gè)iota 表示為0,當(dāng)iota 再次在新的一行使用時(shí),它的值累加 1。第一行之外的 = iota 可以省略,只要出現(xiàn)了一次 iota, 當(dāng)前 const 結(jié)構(gòu)中后面每一行 iota的值加1。
package main import "fmt" func main() { const ( a = iota // 0 b // 1 c // 2 d = "ha" // "ha", iota += 1, iota = 3 e // "ha", iota += 1, iota = 4 f = 100 // 100, iota += 1, iota = 5 g // 100, iota += 1, iota = 6 h = iota // 7 i // 8 ) fmt.Println(a,b,c,d,e,f,g,h,i) // 結(jié)果為 0 1 2 ha ha 100 100 7 8 // 另一個(gè)有趣的示例 const ( x = 1 << iota // 1 << 0 y = 3 << iota // 3 << 1 z // 3 << 2 q // 3 << 3 ) fmt.Println(x,y,z,q) // 結(jié)果為 1 6 12 24 }
格式化輸出
使用 fmt 包進(jìn)行格式化輸出,可參考鏈接
格式化輸出方式
強(qiáng)制類型轉(zhuǎn)換
type_name(expression) // 如 f := float32(3) i := int64(2)
注意:將長(zhǎng)類型強(qiáng)制轉(zhuǎn)換為短類型時(shí)會(huì)發(fā)生截?cái)?/p>
感謝各位的閱讀,以上就是“Golang中常用的基本數(shù)據(jù)類型有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Golang中常用的基本數(shù)據(jù)類型有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
本文標(biāo)題:Golang中常用的基本數(shù)據(jù)類型有哪些
分享鏈接:http://chinadenli.net/article32/pddipc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站維護(hù)、外貿(mào)建站、企業(yè)網(wǎng)站制作、網(wǎng)站導(dǎo)航、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)