一。切片之間通過(guò)append追加
func main(){
a:=[]int{1,2,3}
b:=[]int{4,5,6}
//這個(gè)是錯(cuò)誤的編程
a=append(a, b)
//正確的編程應(yīng)該是
a=append(a, b...)
}
//原因:切片之間通過(guò)append追加時(shí)要用 ... 符號(hào)谁撼,表示將b中的內(nèi)容追加的a中。
//也可以通過(guò) a=append(a, 4, 5, 6)這種方式追加
二。全局變量定義
var(
a:=10 //錯(cuò)誤編碼
b=a*2
)
func main(){
fmt.println(b)
}
//原因:簡(jiǎn)寫(xiě)方式的定義變量只能在函數(shù)內(nèi)部使用坝撑,全局變量不能使用。
//擴(kuò)展:變量在定義時(shí)就初始化時(shí)粮揉,如果沒(méi)有說(shuō)明類(lèi)型巡李,編譯器會(huì)根據(jù)所賦的值,自動(dòng)推導(dǎo)
三扶认。 結(jié)構(gòu)體比較
type sn3 struct {
name string
age int
}
func main() {
sn1 := struct {
age int
name string
}{age: 11, name: "qq"}
sn2 := struct {
age int
name string
}{age: 11, name: "qq"}
if sn1 == sn2 {
fmt.Println("sn1 == sn2")
}
sm1 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
sm2 := struct {
age int
m map[string]string
}{age: 11, m: map[string]string{"a": "1"}}
if sm1 == sm2 { //該處代碼報(bào)錯(cuò)侨拦,編譯不過(guò)
fmt.Println("sm1 == sm2")
}
}
- 知識(shí)點(diǎn)總結(jié)
- 結(jié)構(gòu)體之間只能比較是否相等,不能比較大小
- 相同類(lèi)型的結(jié)構(gòu)體之間才能比較辐宾,結(jié)構(gòu)體類(lèi)型是否相同不僅于屬性類(lèi)型有關(guān)狱从,還與定義的屬性順序有關(guān)。例如:sn1和sn2就可以比較叠纹,和sn3就不可以比較
- 如果 struct 的所有成員都可以比較季研,則該 struct 就可以通過(guò) == 或 != 進(jìn)行比較是否相等,比較時(shí)逐個(gè)項(xiàng)進(jìn)行比較誉察,如果每一項(xiàng)都相等训貌,則兩個(gè)結(jié)構(gòu)體才相等,否則不相等冒窍。那什么是可比較的呢递沪,常見(jiàn)的有 bool、數(shù)值型综液、字符款慨、指針、數(shù)組等谬莹,像切片檩奠、map、函數(shù)等是不能比較的
四附帽。類(lèi)型別名和重新定義新的類(lèi)型
type MyType1 int
type MyType2 = int
func main(){
var a int = 10
var b MyType1 = a //此處代碼編譯不過(guò)
var c MyType2 = a
}
- 考察知識(shí)點(diǎn)
- 類(lèi)型別名與類(lèi)型定義的區(qū)別
- 類(lèi)型別名的定義用 = 符號(hào)
- 第 1 行代碼是基于類(lèi)型 int 創(chuàng)建了新類(lèi)型 MyType1埠戳,第 2 行代碼是創(chuàng)建了 int 的類(lèi)型別名 MyType2。所以蕉扮,第 5行代碼相當(dāng)于是將 int 類(lèi)型的變量賦值給 MyType1類(lèi)型的變量整胃,Go 是強(qiáng)類(lèi)型語(yǔ)言,編譯當(dāng)然不通過(guò)喳钟;而 MyType2只是 int 的別名屁使,本質(zhì)上還是 int在岂,可以賦值
- 可以通過(guò)類(lèi)型轉(zhuǎn)換賦值 例如:var b MyType1 = MyType1(a)
五。go中iota的使用
const (
x = iota
_
y
z = "zz"
k
p = iota
)
func main() {
fmt.Println(x,y,z,k,p) //打印的結(jié)果值為:0, 2, zz, zz, 5
}
- 考察知識(shí)點(diǎn)
- iota是golang語(yǔ)言的常量計(jì)數(shù)器,只能在常量的表達(dá)式中使用
- iota在const關(guān)鍵字出現(xiàn)時(shí)將被重置為0(const內(nèi)部的第一行之前)
- const中每新增一行常量聲明將使iota計(jì)數(shù)一次(iota可理解為const語(yǔ)句塊中的行索引)
六蛮寂。go類(lèi)型選擇(type)
func GetValue() int{
return 1
}
func main(){
i:= GetValue()
switch i.(type){ //此處報(bào)錯(cuò)
case int:
fmt.Println("int")
case string:
fmt.Println("string")
}
}
- 考察知識(shí)點(diǎn)
- 類(lèi)型選擇的語(yǔ)法為:i.(type)
- type是固定的關(guān)鍵字蔽午,但是i類(lèi)型必須是interface{} 接口類(lèi)型,才能使用 i.(type)來(lái)判斷類(lèi)型
七酬蹋。切片和數(shù)組細(xì)節(jié)
func test(i...int){
i[0]=18
}
func mian(){
a:=[]int{1,2,3}
test(a...)
fmt.println(a[0])
//輸出結(jié)果為及老,A. 1 B. 18 C.Compilation error
}
- 考察知識(shí)點(diǎn)
- 答案為B
- 首先a的類(lèi)型是一個(gè)切片。由于定義的切片是通過(guò)中括號(hào)的方式定義的而不是通過(guò)make方式定義的范抓,所以切片的len和cap都為切片的長(zhǎng)度骄恶,本例中為3 。
- 如果如果中括號(hào)中有數(shù)值指定長(zhǎng)度尉咕,例如 a:=[3]int{1,2,3},則定義的是數(shù)組類(lèi)型叠蝇,而不是切片類(lèi)型
- 切片類(lèi)型屬于引用類(lèi)型,所以結(jié)果為B
- 如果函數(shù)參數(shù)的類(lèi)型為可變參數(shù)年缎,那么只有切片類(lèi)型的可以通過(guò) a...三個(gè)點(diǎn)的方式傳遞參數(shù)悔捶,數(shù)組是不可以的,會(huì)報(bào)錯(cuò)
八单芜。 數(shù)組比較
func main(){
a:=[2]int{1,2}
b:=[3]int{1,2}
fmt.println(a==b)
}
- 考察知識(shí)點(diǎn)
- 編譯報(bào)錯(cuò)
- 數(shù)組是值類(lèi)型可以進(jìn)行比較
- 但是是否是同一個(gè)數(shù)組的值類(lèi)型蜕该,除了類(lèi)型之外,還需要長(zhǎng)度相同洲鸠。只要有一個(gè)不同就是不同的類(lèi)型堂淡,就不能比較。所以a的長(zhǎng)度為2扒腕,b的長(zhǎng)度為3所以不是同一個(gè)類(lèi)型绢淀,所以不能比較。