日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go 语言学习

發布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 语言学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


菜鳥教程 - Go語言教程:http://www.runoob.com/go/go-tutorial.html
Go語言入門教程,Golang入門教程(非常詳細):http://c.biancheng.net/golang
易百 - Go語言教程:https://www.yiibai.com/go
《Go入門指南》電子書:https://www.kancloud.cn/kancloud/the-way-to-go/72432
笨鳥學Go——最簡單的Go教程:http://www.slowbirdgogogo.com/????

Go 語言相關書籍:京東搜索 go 的相關書籍

?

Microsoft Visual Studio Code:https://blog.csdn.net/freeking101/article/details/86715578

?

?

打算開始學習 go 語言,就搜了下go 的資料,先按上面鏈接把 Go 語言基礎過一遍。最好按 一個網站來看,比如把 菜鳥教程上面 Go語言教程 從頭看到尾。然后在看其他網站教程,這時候可以不像 看 菜鳥網上教程那么仔細,但是注意多寫程序練習。

上面都看完之后,可以找一些實戰項目練習下,或者把以前用 Python 寫的爬蟲用 go 在重寫下。

?

?

GO 語言新手:8個實戰教程:

基礎教程:

  • Go語言編程

  • Go by Example 中文版

實戰項目:

  • 《 Go 語言實戰 》 快速開始一個 Go 程序

  • GO語言開發2048

  • GO語言制作Markdown預覽器

  • 基于GO語言Revel框架和mgo的博客

  • Go 語言實現緩存系統

  • Go 語言實現WebSocket協議

最后:

希望以上8個教程能給你學習GO語言有所幫助,如果你想要學習其他技術領域,可以看下面:

  • 學習路徑:12條技術路徑,照著路徑系統學習,入門該領域;
  • 海量教程:基礎、實戰項目,各技術領域應有盡有,更有在線開發環境隨時玩;
  • 挑戰比賽:學完之后,參加挑戰,看看自己水平如何,更可以參加比賽,PK實力;’

?

?

Go 語言環境安裝

?

安裝包下載地址為:https://golang.org/dl/。

如果打不開可以使用這個地址:https://golang.google.cn/dl/。

各個系統對應的包名:

操作系統包名
Windowsgo1.4.windows-amd64.msi
Linuxgo1.4.linux-amd64.tar.gz
Macgo1.4.darwin-amd64-osx10.8.pkg
FreeBSDgo1.4.freebsd-amd64.tar.gz

?

UNIX/Linux/Mac OS X, 和 FreeBSD 安裝

以下介紹了在UNIX/Linux/Mac OS X, 和 FreeBSD系統下使用源碼安裝方法:

1、下載二進制包:go1.4.linux-amd64.tar.gz。

2、將下載的二進制包解壓至 /usr/local目錄。

tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz

3、將 /usr/local/go/bin 目錄添加至PATH環境變量:

export PATH=$PATH:/usr/local/go/bin

注意:MAC 系統下你可以使用?.pkg?結尾的安裝包直接雙擊來完成安裝,安裝目錄在?/usr/local/go/?下。


Windows 系統下安裝

Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.4.2.windows-amd64.msi)的安裝包來安裝。

默認情況下.msi文件會安裝在 c:\Go 目錄下。你可以將 c:\Go\bin 目錄添加到 PATH 環境變量中。添加后你需要重啟命令窗口才能生效。

安裝測試

創建工作目錄 C:\>Go_WorkSpace。

文件名: test.go,代碼如下:

package mainimport "fmt"func main() {fmt.Println("Hello, World!") }

使用 go 命令執行以上代碼輸出結果如下:

C:\Go_WorkSpace>go run test.go
Hello, World!

?

?

?

Go 語言結構

?

Go 語言的基礎組成有以下幾個部分:

  • 包聲明
  • 引入包
  • 函數
  • 變量
  • 語句 & 表達式
  • 注釋

接下來讓我們來看下簡單的代碼,該代碼輸出了"Hello World!":

package mainimport "fmt"func main() {/* 這是我的第一個簡單的程序 */fmt.Println("Hello, World!") }

看下以上程序的各個部分:

  • 第一行代碼?package main?定義了包名。你必須在源文件中非注釋的第一行指明這個文件屬于哪個包,如:package main。package main表示一個可獨立執行的程序,每個 Go 應用程序都包含一個名為 main 的包。

  • 下一行?import "fmt"?告訴 Go 編譯器這個程序需要使用 fmt 包(的函數,或其他元素),fmt 包實現了格式化 IO(輸入/輸出)的函數。

  • 下一行?func main()?是程序開始執行的函數。main 函數是每一個可執行程序所必須包含的,一般來說都是在啟動后第一個執行的函數(如果有 init() 函數則會先執行該函數)。

  • 下一行 /*...*/ 是注釋,在程序執行時將被忽略。單行注釋是最常見的注釋形式,你可以在任何地方使用以 // 開頭的單行注釋。多行注釋也叫塊注釋,均已以 /* 開頭,并以 */ 結尾,且不可以嵌套使用,多行注釋一般用于包的文檔描述或注釋成塊的代碼片段。

  • 下一行?fmt.Println(...)?可以將字符串輸出到控制臺,并在最后自動增加換行字符 \n。?
    使用 fmt.Print("hello, world\n") 可以得到相同的結果。?
    Print 和 Println 這兩個函數也支持使用變量,如:fmt.Println(arr)。如果沒有特別指定,它們會以默認的打印格式將變量 arr 輸出到控制臺。

  • 當標識符(包括常量、變量、類型、函數名、結構字段等等)以一個大寫字母開頭,如:Group1,那么使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱為導出(像面向對象語言中的 public);標識符如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見并且可用的(像面向對象語言中的 protected )。

  • ?

    執行 Go 程序

    讓我們來看下如何編寫 Go 代碼并執行它。步驟如下:

  • 打開編輯器如Sublime2,將以上代碼添加到編輯器中。

  • 將以上代碼保存為?hello.go

  • 打開命令行,并進入程序文件保存的目錄中。

  • 輸入命令?go run hello.go?并按回車執行代碼。

  • 如果操作正確你將在屏幕上看到?"Hello World!"?字樣的輸出。

  • $ go run hello.go
    Hello, World!

    ?

    注意

    需要注意的是?{?不能單獨放在一行,所以以下代碼在運行時會產生錯誤:

    package mainimport "fmt"func main() { // 錯誤,{ 不能在單獨的行上fmt.Println("Hello, World!") }

    ?

    ?

    ?

    Learn X in Y minutes

    ?

    Go語言有非常棒的標準庫,還有一個充滿熱情的社區。

    // 單行注釋 /* 多行注釋 */// 導入包的子句在每個源文件的開頭。 // Main比較特殊,它用來聲明可執行文件,而不是一個庫。 package main// Import語句聲明了當前文件引用的包。 import ("fmt" // Go語言標準庫中的包"io/ioutil" // 包含一些輸入輸出函數m "math" // 數學標準庫,在此文件中別名為m"net/http" // 一個web服務器包"os" // 系統底層函數,如文件讀寫"strconv" // 字符串轉換 )// 函數聲明:Main是程序執行的入口。 // 不管你喜歡還是不喜歡,反正Go就用了花括號來包住函數體。 func main() {// 往標準輸出打印一行。// 用包名fmt限制打印函數。fmt.Println("天坑歡迎你!")// 調用當前包的另一個函數。beyondHello() }// 函數可以在括號里加參數。 // 如果沒有參數的話,也需要一個空括號。 func beyondHello() {var x int // 變量聲明,變量必須在使用之前聲明。x = 3 // 變量賦值。// 可以用:=來偷懶,它自動把變量類型、聲明和賦值都搞定了。y := 4sum, prod := learnMultiple(x, y) // 返回多個變量的函數fmt.Println("sum:", sum, "prod:", prod) // 簡單輸出learnTypes() // 少于y分鐘,學的更多! }/* <- 快看快看我是跨行注釋_(:з」∠)_ Go語言的函數可以有多個參數和 *多個* 返回值。 在這個函數中, `x`、`y` 是參數, `sum`、`prod` 是返回值的標識符(可以理解為名字)且類型為int */ func learnMultiple(x, y int) (sum, prod int) {return x + y, x * y // 返回兩個值 }// 內置變量類型和關鍵詞 func learnTypes() {// 短聲明給你所想。str := "少說話多讀書!" // String類型s2 := `這是一個 可以換行的字符串` // 同樣是String類型// 非ascii字符。Go使用UTF-8編碼。g := 'Σ' // rune類型,int32的別名,使用UTF-8編碼f := 3.14195 // float64類型,IEEE-754 64位浮點數c := 3 + 4i // complex128類型,內部使用兩個float64表示// Var變量可以直接初始化。var u uint = 7 // unsigned 無符號變量,但是實現依賴int型變量的長度var pi float32 = 22. / 7// 字符轉換n := byte('\n') // byte是uint8的別名// 數組(Array)類型的大小在編譯時即確定var a4 [4] int // 有4個int變量的數組,初始為0a3 := [...]int{3, 1, 5} // 有3個int變量的數組,同時進行了初始化// Array和slice各有所長,但是slice可以動態的增刪,所以更多時候還是使用slice。s3 := []int{4, 5, 9} // 回去看看 a3 ,是不是這里沒有省略號?s4 := make([]int, 4) // 分配4個int大小的內存并初始化為0var d2 [][]float64 // 這里只是聲明,并未分配內存空間bs := []byte("a slice") // 進行類型轉換// 切片(Slice)的大小是動態的,它的長度可以按需增長// 用內置函數 append() 向切片末尾添加元素// 要增添到的目標是 append 函數第一個參數,// 多數時候數組在原內存處順次增長,如s := []int{1, 2, 3} // 這是個長度3的slices = append(s, 4, 5, 6) // 再加仨元素,長度變為6了fmt.Println(s) // 更新后的數組是 [1 2 3 4 5 6]// 除了向append()提供一組原子元素(寫死在代碼里的)以外,我們// 還可以用如下方法傳遞一個slice常量或變量,并在后面加上省略號,// 用以表示我們將引用一個slice、解包其中的元素并將其添加到s數組末尾。s = append(s, []int{7, 8, 9}...) // 第二個參數是一個slice常量fmt.Println(s) // 更新后的數組是 [1 2 3 4 5 6 7 8 9]p, q := learnMemory() // 聲明p,q為int型變量的指針fmt.Println(*p, *q) // * 取值// Map是動態可增長關聯數組,和其他語言中的hash或者字典相似。m := map[string]int{"three": 3, "four": 4}m["one"] = 1// 在Go語言中未使用的變量在編譯的時候會報錯,而不是warning。// 下劃線 _ 可以使你“使用”一個變量,但是丟棄它的值。_, _, _, _, _, _, _, _, _, _ = str, s2, g, f, u, pi, n, a3, s4, bs// 通常的用法是,在調用擁有多個返回值的函數時,// 用下劃線拋棄其中的一個參數。下面的例子就是一個臟套路,// 調用os.Create并用下劃線變量扔掉它的錯誤代碼。// 因為我們覺得這個文件一定會成功創建。file, _ := os.Create("output.txt")fmt.Fprint(file, "這句代碼還示范了如何寫入文件呢")file.Close()// 輸出變量fmt.Println(s, c, a4, s3, d2, m)learnFlowControl() // 回到流程控制 }// 和其他編程語言不同的是,go支持有名稱的變量返回值。 // 聲明返回值時帶上一個名字允許我們在函數內的不同位置 // 只用寫return一個詞就能將函數內指定名稱的變量返回 func learnNamedReturns(x, y int) (z int) {z = x * yreturn // z is implicit here, because we named it earlier. }// Go全面支持垃圾回收。Go有指針,但是不支持指針運算。 // 你會因為空指針而犯錯,但是不會因為增加指針而犯錯。 func learnMemory() (p, q *int) {// 返回int型變量指針p和qp = new(int) // 內置函數new分配內存// 自動將分配的int賦值0,p不再是空的了。s := make([]int, 20) // 給20個int變量分配一塊內存s[3] = 7 // 賦值r := -2 // 聲明另一個局部變量return &s[3], &r // & 取地址 }func expensiveComputation() int {return 1e6 }func learnFlowControl() {// If需要花括號,括號就免了if true {fmt.Println("這句話肯定被執行")}// 用go fmt 命令可以幫你格式化代碼,所以不用怕被人吐槽代碼風格了,// 也不用容忍別人的代碼風格。if false {// pout} else {// gloat}// 如果太多嵌套的if語句,推薦使用switchx := 1switch x {case 0:case 1:// 隱式調用break語句,匹配上一個即停止case 2:// 不會運行}// 和if一樣,for也不用括號for x := 0; x < 3; x++ { // ++ 自增fmt.Println("遍歷", x)}// x在這里還是1。為什么?// for 是go里唯一的循環關鍵字,不過它有很多變種for { // 死循環break // 騙你的continue // 不會運行的}// 用range可以枚舉 array、slice、string、map、channel等不同類型// 對于channel,range返回一個值,// array、slice、string、map等其他類型返回一對兒for key, value := range map[string]int{"one": 1, "two": 2, "three": 3} {// 打印map中的每一個鍵值對fmt.Printf("索引:%s, 值為:%d\n", key, value)}// 如果你只想要值,那就用前面講的下劃線扔掉沒用的for _, name := range []string{"Bob", "Bill", "Joe"} {fmt.Printf("你是。。 %s\n", name)}// 和for一樣,if中的:=先給y賦值,然后再和x作比較。if y := expensiveComputation(); y > x {x = y}// 閉包函數xBig := func() bool {return x > 100 // x是上面聲明的變量引用}fmt.Println("xBig:", xBig()) // true (上面把y賦給x了)x /= 1e5 // x變成10fmt.Println("xBig:", xBig()) // 現在是false// 除此之外,函數體可以在其他函數中定義并調用,// 滿足下列條件時,也可以作為參數傳遞給其他函數:// a) 定義的函數被立即調用// b) 函數返回值符合調用者對類型的要求fmt.Println("兩數相加乘二: ",func(a, b int) int {return (a + b) * 2}(10, 2)) // Called with args 10 and 2// => Add + double two numbers: 24// 當你需要goto的時候,你會愛死它的!goto love love:learnFunctionFactory() // 返回函數的函數多棒啊learnDefer() // 對defer關鍵字的簡單介紹learnInterfaces() // 好東西來了! }func learnFunctionFactory() {// 空行分割的兩個寫法是相同的,不過第二個寫法比較實用fmt.Println(sentenceFactory("原諒")("當然選擇", "她!"))d := sentenceFactory("原諒")fmt.Println(d("當然選擇", "她!"))fmt.Println(d("你怎么可以", "她?")) }// Decorator在一些語言中很常見,在go語言中, // 接受參數作為其定義的一部分的函數是修飾符的替代品 func sentenceFactory(mystring string) func(before, after string) string {return func(before, after string) string {return fmt.Sprintf("%s %s %s", before, mystring, after) // new string} }func learnDefer() (ok bool) {// defer表達式在函數返回的前一刻執行defer fmt.Println("defer表達式執行順序為后進先出(LIFO)")defer fmt.Println("\n這句話比上句話先輸出,因為")// 關于defer的用法,例如用defer關閉一個文件,// 就可以讓關閉操作與打開操作的代碼更近一些return true }// 定義Stringer為一個接口類型,有一個方法String type Stringer interface {String() string }// 定義pair為一個結構體,有x和y兩個int型變量。 type pair struct {x, y int }// 定義pair類型的方法,實現Stringer接口。 func (p pair) String() string { // p被叫做“接收器”// Sprintf是fmt包中的另一個公有函數。// 用 . 調用p中的元素。return fmt.Sprintf("(%d, %d)", p.x, p.y) }func learnInterfaces() {// 花括號用來定義結構體變量,:=在這里將一個結構體變量賦值給p。p := pair{3, 4}fmt.Println(p.String()) // 調用pair類型p的String方法var i Stringer // 聲明i為Stringer接口類型i = p // 有效!因為p實現了Stringer接口(類似java中的塑型)// 調用i的String方法,輸出和上面一樣fmt.Println(i.String())// fmt包中的Println函數向對象要它們的string輸出,實現了String方法就可以這樣使用了。// (類似java中的序列化)fmt.Println(p) // 輸出和上面一樣,自動調用String函數。fmt.Println(i) // 輸出和上面一樣。learnVariadicParams("great", "learning", "here!") }// 有變長參數列表的函數 func learnVariadicParams(myStrings ...interface{}) {// 枚舉變長參數列表的每個參數值// 下劃線在這里用來拋棄枚舉時返回的數組索引值for _, param := range myStrings {fmt.Println("param:", param)}// 將可變參數列表作為其他函數的參數列表fmt.Println("params:", fmt.Sprintln(myStrings...))learnErrorHandling() }func learnErrorHandling() {// ", ok"用來判斷有沒有正常工作m := map[int]string{3: "three", 4: "four"}if x, ok := m[1]; !ok { // ok 為false,因為m中沒有1fmt.Println("別找了真沒有")} else {fmt.Print(x) // 如果x在map中的話,x就是那個值嘍。}// 錯誤可不只是ok,它還可以給出關于問題的更多細節。if _, err := strconv.Atoi("non-int"); err != nil { // _ discards value// 輸出"strconv.ParseInt: parsing "non-int": invalid syntax"fmt.Println(err)}// 待會再說接口吧。同時,learnConcurrency() }// c是channel類型,一個并發安全的通信對象。 func inc(i int, c chan int) {c <- i + 1 // <-把右邊的發送到左邊的channel。 }// 我們將用inc函數來并發地增加一些數字。 func learnConcurrency() {// 用make來聲明一個slice,make會分配和初始化slice,map和channel。c := make(chan int)// 用go關鍵字開始三個并發的goroutine,如果機器支持的話,還可能是并行執行。// 三個都被發送到同一個channel。go inc(0, c) // go is a statement that starts a new goroutine.go inc(10, c)go inc(-805, c)// 從channel中讀取結果并打印。// 打印出什么東西是不可預知的。fmt.Println(<-c, <-c, <-c) // channel在右邊的時候,<-是讀操作。cs := make(chan string) // 操作string的channelcc := make(chan chan string) // 操作channel的channelgo func() { c <- 84 }() // 開始一個goroutine來發送一個新的數字go func() { cs <- "wordy" }() // 發送給cs// Select類似于switch,但是每個case包括一個channel操作。// 它隨機選擇一個準備好通訊的case。select {case i := <-c: // 從channel接收的值可以賦給其他變量fmt.Println("這是……", i)case <-cs: // 或者直接丟棄fmt.Println("這是個字符串!")case <-cc: // 空的,還沒作好通訊的準備fmt.Println("別瞎想")}// 上面c或者cs的值被取到,其中一個goroutine結束,另外一個一直阻塞。learnWebProgramming() // Go很適合web編程,我知道你也想學! }// http包中的一個簡單的函數就可以開啟web服務器。 func learnWebProgramming() {// ListenAndServe第一個參數指定了監聽端口,第二個參數是一個接口,特定是http.Handler。go func() {err := http.ListenAndServe(":8080", pair{})fmt.Println(err) // 不要無視錯誤。}()requestServer() }// 使pair實現http.Handler接口的ServeHTTP方法。 func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {// 使用http.ResponseWriter返回數據w.Write([]byte("Y分鐘golang速成!")) }func requestServer() {resp, err := http.Get("http://localhost:8080")fmt.Println(err)defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)fmt.Printf("\n服務器消息: `%s`", string(body)) }

    更進一步

    關于Go的一切你都可以在Go官方網站找到。 在那里你可以獲得教程參考,在線試用,和更多的資料。 在簡單的嘗試過后,在官方文檔那里你會得到你所需要的所有資料、關于編寫代碼的規范、庫和命令行工具的文檔與Go的版本歷史。

    強烈推薦閱讀語言定義部分,很簡單而且很簡潔!(趕時髦!)

    你還可以前往Go在線體驗中心進,在瀏覽器里修改并運行這些代碼,一定要試一試哦!你可以將https://play.golang.org當作一個REPL,在那里體驗語言特性或運行自己的代碼,連環境都不用配!

    學習Go還要閱讀Go標準庫的源代碼,全部文檔化了,可讀性非常好,可以學到go,go style和go idioms。在文檔中點擊函數名,源代碼就出來了!

    Go by example也是一個學習的好地方。

    Go Mobile添加了對移動平臺的支持(Android and iOS)。你可以完全用go語言來創造一個app或編寫一個可以從Java或Obj-C調用的函數庫,敬請參考Go Mobile page。

    ?

    ?

    ?

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Go 语言学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。