自學(xué)go中(二)
類型
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T", t) // %T 輸出 t 是什么類型
case bool:
fmt.Printf("boolean %t\n", t) // t 是 bool 類型
case int:
fmt.Printf("integer %d\n", t) // t 是 int 類型
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t 是 *bool 類型
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t 是 *int 類型
}
byte湃番,[]byte和string類型
defer(重點(diǎn)理解和使用類型)
推遲執(zhí)行函數(shù)铐姚,多用于資源關(guān)閉(比如可能出現(xiàn)錯(cuò)誤,等異常情況返回的時(shí)候)
數(shù)據(jù)
初始化,分配
new分配方法
- 分配的結(jié)果是一個(gè)指向類型為T的內(nèi)存地址空間
- 返回類型為*T
- 屬性會(huì)被分配為 “零值”
p := new(SyncedBuffer) // type *SyncedBuffer
var v SyncedBuffer // type SyncedBuffer
構(gòu)造函數(shù)
零值分配有時(shí)候可能不太好唯沮,需要一個(gè)構(gòu)造函數(shù)一般構(gòu)造函數(shù)都是使用NewStrcut
的方式創(chuàng)建伏尼。
或者可以再配合上復(fù)合字面來初始化
make分配
make只用來創(chuàng)建 切片忿檩,映射,和信道爆阶,返回的類型都為T燥透,如果明確知道需要的是 *T,就要使用new方式或者構(gòu)造函數(shù)以及復(fù)合字面產(chǎn)生指針類型的結(jié)構(gòu)體辨图。
make一個(gè)切片班套,切片這個(gè)結(jié)構(gòu)里面保存了三個(gè)內(nèi)容(指向數(shù)組的指針,長(zhǎng)度故河,和容量)吱韭。
數(shù)組
數(shù)組的含義非常清晰,用法也不多說鱼的。主要來說下GO中數(shù)組與C的區(qū)別理盆。
- 數(shù)組是值,在C中數(shù)組是指針凑阶。所以在函數(shù)中使用數(shù)組是直接傳輸數(shù)組的副本的
- 數(shù)組的大小是其類型的一部分猿规,所有[10]int 和[20]int的類型是不同的。所以如果在函數(shù)使用的過程中需要傳遞一個(gè)數(shù)組或者一個(gè)數(shù)組的指針那么一定要明確數(shù)組的大小
所以一般都使用切片
切片
使用非常頻繁宙橱,只需要熟悉幾個(gè)內(nèi)置函數(shù)
append
取得其第1個(gè)到第4個(gè) slice[0:4]
二維數(shù)組>二維切片
二維切片的make方法和一維沒有什么太大的區(qū)別
映射
只要支持相等性判斷的類型都可以使用映射(切片沒有實(shí)現(xiàn))
若試圖通過映射中不存在的鍵來取值姨俩,就會(huì)返回與該映射中項(xiàng)的類型對(duì)應(yīng)的零值,也就是說如果value的T是bool师郑,那么key不存在情況下就會(huì)返回對(duì)應(yīng)默認(rèn)的零值环葵。但是有些時(shí)候,key存在對(duì)應(yīng)的value就是零值宝冕,那么怎么辦张遭。所以映射訪問會(huì)返回 value,ok = map[key]如果ok為true就表示存在。
刪除猬仁,使用delete
常量
常量只能是數(shù)字帝璧、字符(符文)先誉、字符串或布爾值。由于編譯時(shí)的限制的烁, 定義它們的表達(dá)式必須也是可被編譯器求值的常量表達(dá)式褐耳。例如 1<<3 就是一個(gè)常量表達(dá)式,而 math.Sin(math.Pi/4) 則不是渴庆,因?yàn)閷?duì) math.Sin 的函數(shù)調(diào)用在運(yùn)行時(shí)才會(huì)發(fā)生铃芦。
總體來說:常量必須是在編譯的時(shí)候就能確定的
type ByteSize float64
const (
// 通過賦予空白標(biāo)識(shí)符來忽略第一個(gè)值
_ = iota // ignore first value by assigning to blank identifier
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
PB
EB
ZB
YB
)
變量
變量的初始化與常量類似,但其初始值也可以是在運(yùn)行時(shí)才被計(jì)算的一般表達(dá)式襟雷。
init
所有變量聲明都通過它們的初始化器求值后 init 才會(huì)被調(diào)用刃滓, 而那些 init 只有在所有已導(dǎo)入的包都被初始化后才會(huì)被求值
問題
string與byte類型
nil問題