tips: *號,可以指向指針類型內(nèi)存地址上的值,號,可以獲取值類型的內(nèi)存地址
成都創(chuàng)新互聯(lián)公司公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元合肥做網(wǎng)站,已為上家服務(wù),為合肥各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
每一個變量都有內(nèi)存地址,可以通過變量來操作內(nèi)存地址中的值,即內(nèi)存的大小
go語言中獲取變量的內(nèi)存地址方法:通過 符號可以獲取變量的地址
定義:普通變量存儲的是對應(yīng)類型的值,這些類型就叫值類型
變量b,在內(nèi)存中的地址為:0x1040a124,在這個內(nèi)存地址上存儲的值為:156
定義:指針類型的變量存儲的是?個地址,所以?叫指針類型或引?類型
b 是值類型,它指向的是內(nèi)存地址上的值
a是指針類型,它指向的是b的內(nèi)存地址
指針類型定義,語法: var 變量名 *類型
指針類型在定義完成后,默認(rèn)為空地址,即空指針(nil)
在定義好指針變量后,可以通過***** 符號可以獲取指針變量指向的變量
在這里的 *a 等價于 b,通過修改 *a ,最終修改的是值類型b的值
這里a,d是值類型,b,c是指針類型
d就相當(dāng)于把a(bǔ)內(nèi)存地址上值,在內(nèi)存中從新開辟了一塊空間存儲,d和a互不影響
b,c相當(dāng)于指向了a的內(nèi)存地址,當(dāng)使用*號引用出內(nèi)存地址上的變量上,修改值得,a的值也會跟著改變
大家經(jīng)常用"=="來比較兩個變量是否相等。但是golang中的"=="有很多細(xì)節(jié)的地方,跟php是不一樣的。很多時候不能直接用"=="來比較,編譯器會直接報錯。
golang中基本類型的比較規(guī)則和復(fù)合類型的不一致,先介紹下golang的變量類型:
golang中的基本類型
比較的兩個變量類型必須相等。而且,golang沒有隱式類型轉(zhuǎn)換,比較的兩個變量必須類型完全一樣,類型別名也不行。如果要比較,先做類型轉(zhuǎn)換再比較。
復(fù)合類型是逐個字段,逐個元素比較的。需要注意的是, array 或者struct中每個元素必須要是可比較的,如果某個array的元素 or struct的成員不能比較(比如是后面介紹的slice,map等),則此復(fù)合類型也不能比較。
逐個成員比較類型和值。每個對應(yīng)成員的比較遵循基本類型變量的比較規(guī)則。
但是如果struct中有不可比較的成員類型時:
可以看到,struct中有slice這種不可比較的成員時,整個struct都不能做比較,即使沒有對slice那個成員賦值(slice默認(rèn)值為nil)
slice和map的比較規(guī)則比較奇怪,我們先說普通的變量引用類型val和channel的比較規(guī)則。
引用類型變量存儲的是某個變量的內(nèi)存地址。所以引用類型變量的比較,判斷的是這兩個引用類型存儲的是不是同一個變量。
上面看起來比較廢話,但是得理解引用類型的含義。不然對判斷規(guī)則還是不清楚。
slice類型不可比較,只能與零值nil做比較。
關(guān)于slice類型不可比較的原因,后面會專門寫文章做討論。
map類型和slice一樣,不能比較,只能與nil做比較。
接口類型的變量,包含該接口變量存儲的值和值的類型兩部分組成,分別稱為接口的動態(tài)類型和動態(tài)值。 只有動態(tài)類型和動態(tài)值都相同時,兩個接口變量才相同:
而且接口的動態(tài)類型必須要是可比較的,如果不能比較(比如slice,map),則運(yùn)行時會報panic。因為編譯器在編譯時無法獲取接口的動態(tài)類型,所以編譯能通過,但是運(yùn)行時直接panic:
golang的func作為一等公民,也是一種類型,而且不可比較
上面說過,map和slice是不可比較類型,但是有沒有特殊的方法來對slice和map做比較呢,有
reflect.DeepEqual函數(shù)可以用來比較兩個任意類型的變量
對map類型做比較:
對slice類型做比較:
對struct類型做比較:
可以發(fā)現(xiàn),只要變量的類型和值相同的話,reflect.DeepEqual比較的結(jié)果就為true
直接看用例:
結(jié)果為:
1, golang的類型再定義和類型別名
2,golang的slice和map為什么不可以比較
1,
2,
3,
本文介紹一些Go語言的基礎(chǔ)語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執(zhí)行結(jié)果:
下面來進(jìn)一步介紹go的基礎(chǔ)語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標(biāo)準(zhǔn)庫,
常用方法:
示例代碼:
執(zhí)行結(jié)果:
更多格式化方法可以訪問中的fmt包。
log包實現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。
執(zhí)行結(jié)果:
下面來介紹一下go的數(shù)據(jù)類型
下表列出了go語言的數(shù)據(jù)類型:
int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運(yùn)行時無法改變。
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。
算術(shù)運(yùn)算符:
關(guān)系運(yùn)算符:
邏輯運(yùn)算符:
位運(yùn)算符:
賦值運(yùn)算符:
指針相關(guān)運(yùn)算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執(zhí)行結(jié)果:
下面介紹幾種循環(huán)語句:
執(zhí)行結(jié)果:
執(zhí)行結(jié)果:
也可以通過標(biāo)記退出循環(huán):
--THE END--