GO是編譯性語言,所以函數的順序是無關緊要的,為了方便閱讀,建議入口函數 main 寫在最前面,其余函數按照功能需要進行排列
成都創新互聯公司專注于蘭坪企業網站建設,成都響應式網站建設公司,商城網站建設。蘭坪網站建設公司,為蘭坪等地區提供建站服務。全流程按需搭建網站,專業設計,全程項目跟蹤,成都創新互聯公司專業和態度為您提供的服務
GO的函數 不支持嵌套,重載和默認參數
GO的函數 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等
GO的函數用 func 來聲明,且左大括號 { 不能另起一行
一個簡單的示例:
輸出為:
參數:可以傳0個或多個值來供自己用
返回:通過用 return 來進行返回
輸出為:
上面就是一個典型的多參數傳遞與多返回值
對例子的說明:
按值傳遞:是對某個變量進行復制,不能更改原變量的值
引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內存會更少,只有4或8個字節的消耗
在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結果都是一樣的,但要注意:
當返回了多個值,我們某些變量不想要,或實際用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉
在參數后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數
輸出為:
在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數的例子,更多一些演變的形式,都非常類似
在GO中 defer 關鍵字非常重要,相當于面相對像中的析構函數,也就是在某個函數執行完成后,GO會自動這個;
如果在多層循環中函數里,都定義了 defer ,那么它的執行順序是先進后出;
當某個函數出現嚴重錯誤時, defer 也會被調用
輸出為
這是一個最簡單的測試了,當然還有更復雜的調用,比如調試程序時,判斷是哪個函數出了問題,完全可以根據 defer 打印出來的內容來進行判斷,非常快速,這種留給你們去實現
一個函數在函數體內自己調用自己我們稱之為遞歸函數,在做遞歸調用時,經常會將內存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調用
本篇重點介紹了GO函數(func)的聲明與使用,下一篇將介紹GO的結構 struct
sync.Map是1.9才推薦的并發安全的map,除了互斥量以外,還運用了原子操作,所以在這之前,有必要了解下 Go語言——原子操作
go1.10\src\sync\map.go
entry分為三種情況:
從read中讀取key,如果key存在就tryStore。
注意這里開始需要加鎖,因為需要操作dirty。
條目在read中,首先取消標記,然后將條目保存到dirty里。(因為標記的數據不在dirty里)
最后原子保存value到條目里面,這里注意read和dirty都有條目。
總結一下Store:
這里可以看到dirty保存了數據的修改,除非可以直接原子更新read,繼續保持read clean。
有了之前的經驗,可以猜測下load流程:
與猜測的 區別 :
由于數據保存兩份,所以刪除考慮:
先看第二種情況。加鎖直接刪除dirty數據。思考下貌似沒什么問題,本身就是臟數據。
第一種和第三種情況唯一的區別就是條目是否被標記。標記代表刪除,所以直接返回。否則CAS操作置為nil。這里總感覺少點什么,因為條目其實還是存在的,雖然指針nil。
看了一圈貌似沒找到標記的邏輯,因為刪除只是將他變成nil。
之前以為這個邏輯就是簡單的將為標記的條目拷貝給dirty,現在看來大有文章。
p == nil,說明條目已經被delete了,CAS將他置為標記刪除。然后這個條目就不會保存在dirty里面。
這里其實就跟miss邏輯串起來了,因為miss達到閾值之后,dirty會全量變成read,也就是說標記刪除在這一步最終刪除。這個還是很巧妙的。
真正的刪除邏輯:
很繞。。。。
Go語言作為出現比較晚的一門編程語言,在其原生支持高并發、云原生等領域的優秀表現,像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向對象的語言,雖然也能做云原生相關的開發,但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。
最近在學習Go語言,我之前使用過C#、Java等面向對象編程的語言,發現其中有很多的編程方式和其他語言有區別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。
種一棵樹最好的時間是十年前,其次是現在。
3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式
3)變量賦值 Go語言的變量賦值和多數語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:
在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:
4)匿名變量
在使用其他語言時,有時候要獲取一個值,卻因為該函數返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優雅。
假如GetName()函數返回3個值,分別是firstName,lastName和nickName
若指向獲得nickName,則函數調用可以這樣寫
這種寫法可以讓代碼更清晰,從而大幅降低溝通的復雜度和維護的難度。
1)基本常量
常量使用關鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量
2)預定義常量
Go語言預定義了這些常量 true、false和iota
iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現時被重置為0,然后在下一個const出現之前每出現一個iota,其所代表的數字會自動加1.
3)枚舉
1)int 和int32在Go語言中被認為是兩種不同類型的類型
2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型
3)go語言支持復數類型
復數實際上是由兩個實數(在計算機中使用浮點數表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數學上的那個復數
復數的表示
實部與虛部
對于一個復數z=complex(x,y),就可以通過Go語言內置函數real(z)獲得該復數的實部,也就是x,通過imag(z)獲得該復數的虛部,也就是y
4)數組(值類型,長度在定義后無法再次修改,每次傳遞都將產生一個副本。)
5)數組切片(slice)
數組切片(slice)彌補了數組的不足,其數據結構可以抽象為以下三個變量:
6)Map 在go語言中Map不需要引入任何庫,使用很方便
Go循環語句只支持for關鍵字,不支持while和do-while
goto語句的語義非常簡單,就是跳轉到本函數內的某個標簽
今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發編程、面向對象、網絡編程等方面的不同及使用方法。希望對大家有所幫助。
本文介紹一些Go語言的基礎語法。
先來看一個簡單的go語言代碼:
go語言的注釋方法:
代碼執行結果:
下面來進一步介紹go的基礎語法。
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
常用方法:
示例代碼:
執行結果:
更多格式化方法可以訪問中的fmt包。
log包實現了簡單的日志服務,也提供了一些格式化輸出的方法。
執行結果:
下面來介紹一下go的數據類型
下表列出了go語言的數據類型:
int、float、bool、string、數組和struct屬于值類型,這些類型的變量直接指向存在內存中的值;slice、map、chan、pointer等是引用類型,存儲的是一個地址,這個地址存儲最終的值。
常量是在程序編譯時就確定下來的值,程序運行時無法改變。
執行結果:
執行結果:
Go 語言的運算符主要包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符以及指針相關運算符。
算術運算符:
關系運算符:
邏輯運算符:
位運算符:
賦值運算符:
指針相關運算符:
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這里不做介紹。
if語法格式如下:
if ... else :
else if:
示例代碼:
語法格式:
另外,添加 fallthrough 會強制執行后面的 case 語句,不管下一條case語句是否為true。
示例代碼:
執行結果:
下面介紹幾種循環語句:
執行結果:
執行結果:
也可以通過標記退出循環:
--THE END--
1. os.Getwd()函數
原型:func Getwd()(pwd string, err error)
作用:獲取當前文件路徑
返回:當前文件路徑的字符串和一個err信息
示例:
輸出:
當前路徑: D:ProjectsGomGoLab01
2. os.Getenv()函數
原型:func Getenv(key string) string
作用:獲取系統環境變量的值
參數:key - 系統環境變量名
返回:系統環境變量的值
示例:
輸出:
環境變量GOPATH的值是: D:/Projects/Go
3. os.Chdir()函數
原型:func Chdir(dir string) error
作用:將當前文件路徑改變為目標路徑(非真實改變)
參數:dir - 目標路徑(即改變之后的路徑)
返回:修改成功,返回 nil;修改失敗(如:目標路徑不存在的情況),返回錯誤信息。
示例一:
輸出:
起始路徑: D:ProjectsGomGoLab01
修改后的路徑: D:ProjectsGoDemo02
示例二:
輸出:
起始路徑: D:ProjectsGomGoLab01
error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.
注:文件路徑,Window 系統下默認是“”,寫在代碼中時要用“”或“/”代替。
使用go語言的好處: go語言的設計是務實的, go在針對并發上進行了優化, 并且支持大規模高并發, 又由于單一的碼格式, 相比于其他語言更具有可讀性, 在垃圾回收上比java和Python更有效, 因為他是和程序同時執行的.
1. 進程, 線程, 協程的區別, 協程的優勢
2. 講一下GMP模型(重點)
3. Go的GC, 混合寫屏障(重點)
4. go的Slice和數組的區別, slice的擴容原理(重點)
5. 講一下channel,實現原理(重點)
6. 講一下Go的Map的實現原理, 是否線程安全, 如何實現安全(重點)
7. new 和 make 的區別
8. 說一下內存逃逸
9. 函數傳指針和傳值有什么區別
10. goroutine之間的通信方式
11. 測試是怎么做的(單元測試, 壓力測試)
12. 堆和棧的區別
本文名稱:go語言常用總結,go語言的特性
鏈接URL:http://m.kartarina.com/article32/heiisc.html
成都網站建設公司_創新互聯,為您提供移動網站建設、搜索引擎優化、網站設計公司、App開發、網站改版、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯