變量的聲明
變量的聲明完整寫法如下所示:var param1 int = 1
由于Go可以通過(guò)初始變量值自行判斷數(shù)據(jù)類型贸人,所以在有初始值的情況下可以省略type:var param1 = 1
在聲明局部變量時(shí)间景,可以使用:=
來(lái)進(jìn)一步簡(jiǎn)寫:param1 := 1
當(dāng)聲明變量時(shí)未給予初始值時(shí),會(huì)根據(jù)聲明類型給予零值
- 數(shù)字類型的零值是0
- 布爾類型的零值是false
- 字符串類型的零值是""(空字符串)
- 接口和引用類型(切片艺智、指針倘要、字典、通道十拣、函數(shù))的零值是nil
- 數(shù)組和結(jié)構(gòu)體的零值是其所有成員的零值
指針(pointer)
變量的地址叫做指針
var msg string := "text"
我們可以使用&
取地址操作符封拧,來(lái)獲取變量的地址信息志鹃。
p := &msg
我們也可以通過(guò)指針來(lái)獲取、更改值信息
*p := "pointer"
我們也可以判斷指針是否為nil
來(lái)判斷指針對(duì)象是否執(zhí)行一個(gè)變量
p != nil
指針在Go語(yǔ)言中可以被拆分為兩個(gè)核心概念:
- 類型指針泽西,允許對(duì)這個(gè)指針類型的數(shù)據(jù)進(jìn)行修改曹铃,傳遞數(shù)據(jù)可以直接使用指針,而無(wú)須拷貝數(shù)據(jù)捧杉,類型指針不能進(jìn)行偏移和運(yùn)算陕见。
- 切片,由指向起始元素的原始指針味抖、元素?cái)?shù)量和容量組成评甜。
內(nèi)置函數(shù)new
表達(dá)式new(T)將創(chuàng)建一個(gè)T類型的匿名變量,所做的是為T類型的新值分配并清零一塊內(nèi)存空間非竿,然后將這塊內(nèi)存空間的地址作為結(jié)果返回蜕着,而這個(gè)結(jié)果就是指向這個(gè)新的T類型值的指針值,返回的指針類型為*T红柱。
var p *int
p = new(int)
fmt.Println(*p) //0
string 字符串
string is the set of all strings of 8-bit bytes, conventionally but not necessarily representing UTF-8-encoded text. A string may be empty, but not nil. Values of string type are immutable.
字符串是8位字節(jié)的所有字符串的集合承匣,通常但不一定表示UTF-8編碼的文本。字符串可以為空锤悄,但不能為零韧骗。字符串類型的值是不可變的。
string 數(shù)據(jù)結(jié)構(gòu)
type stringStruct struct {
str unsafe.Pointer //字符串的首地址
len int //字符串的長(zhǎng)度
}
string 操作
聲明
字符串聲明:msg := "文本"
零聚,如果涉及跨行文本袍暴,除開(kāi)\t\n
等轉(zhuǎn)義字符,可以使用``
符號(hào)隶症。
字符串方法
常用字符串方法都處于strings
包下政模,例如字符串替換strings.Replace
,字符串切割strings.Split
蚂会,字符串查詢strings.Contains
淋样,字符串比較strings.Compare
等。
字符串轉(zhuǎn)換
- 常用的字符串-數(shù)字轉(zhuǎn)換方法處于
strconv
包下胁住,如常用的字符串轉(zhuǎn)十進(jìn)制數(shù)字strconv.Atoi
趁猴,常用整型轉(zhuǎn)字符串strconv.Itoa
- string與[]byte、[]rune
先用源碼說(shuō)明一下byte與rune
// 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.
// byte是uint8的別名彪见,在所有方面都與uint8等效儡司。它是按照慣例,用于區(qū)分字節(jié)值和8位無(wú)符號(hào)值整數(shù)值余指。
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.
// rune是int32的別名捕犬,在所有方面都等同于int32。它是按照慣例,用于區(qū)分字符值和整數(shù)值或听。
type rune = int32
強(qiáng)調(diào)說(shuō)明byte是uint8的別名探孝;rune是int32的別名。
string可以使用語(yǔ)言類型轉(zhuǎn)換直接實(shí)現(xiàn)轉(zhuǎn)換實(shí)現(xiàn)與[]byte誉裆、[]rune進(jìn)行相互轉(zhuǎn)換string([]byte)
,[]byte(string)
;string([]rune)
,[]rune(string)
顿颅,其轉(zhuǎn)換過(guò)程使用的是值復(fù)制,所以原數(shù)據(jù)與結(jié)果數(shù)據(jù)兩者相互不受影響足丢。
注意[]byte與[]rune直接不能用直接類型轉(zhuǎn)換進(jìn)行轉(zhuǎn)換粱腻。
若對(duì)string 使用for range循環(huán)操作時(shí),取得的值類型是int32斩跌,即字符值绍些,若要展示真實(shí)文本要使用string(v)進(jìn)行類型轉(zhuǎn)換。
字符串拼接
- 運(yùn)算符
+
拼接
msg := "123"
msg += "4"
fmt.Println(msg)//1234
-
fmt.Sprint
函數(shù)
msg := fmt.Sprint("123", "4")
fmt.Println(msg)//1234
- 構(gòu)建[]string后使用
strings.Join
函數(shù)
msgSlice := []string{"123","4"}
msg := strings.Join(msgSlice,"")
fmt.Println(msg)//1234
- 使用
bytes.Buffer
var b bytes.Buffer
b.WriteString("123")
b.WriteString("4")
fmt.Println(b.String())
- 使用
strings.Builder
(推薦)
var b strings.Builder
b.WriteString("123")
b.WriteString("4")
fmt.Println(b.String())
+
連接適用于短小的耀鸦、常量字符串(明確的柬批,非變量),因?yàn)榫幾g器會(huì)給我們優(yōu)化袖订。
strings.Join
需要配合切片使用氮帐,是比較統(tǒng)一的拼接,不太靈活
fmt和buffer基本上不推薦
builder從性能和靈活性上洛姑,都是上佳的選擇上沐。
數(shù)字
數(shù)字類型分為整型、無(wú)符號(hào)整型楞艾、浮點(diǎn)型参咙,數(shù)字類型直接可以使用語(yǔ)言類型強(qiáng)制轉(zhuǎn)換來(lái)實(shí)現(xiàn)類型轉(zhuǎn)變,如int64(6)
,但是使用強(qiáng)制類型轉(zhuǎn)換會(huì)涉及精度丟失問(wèn)題硫眯,在具體使用中需要注意蕴侧。
數(shù)字類型都可以使用5大運(yùn)算符來(lái)進(jìn)行運(yùn)算+
,-
,*
,/
,%
。
關(guān)于i++
值得注意的是两入,在Go中戈盈,只有i++
,并沒(méi)有++i
谆刨。并且i++
不能用在賦值上,只能獨(dú)立使用归斤。
各數(shù)字類型的極限值
數(shù)字類型 | 極限值 |
---|---|
int8 | 127 |
int16 | 32767 |
int32 | 2147483647 |
int64 | 9223372036854775807 |
int | 9223372036854775807 |
uint8 | 255 |
uint16 | 65535 |
uint32 | 4294967295 |
uint64 | 18446744073709551615 |
uint | 18446744073709551615 |
float32 | 3.4028234663852886e+38 |
float64 | 1.7976931348623157e+308 |