Go語言基礎學習 - 包、變量、函數

      網友投稿 831 2025-03-31

      Go is an open source programming language that makes it easy to build?simple, reliable,?and?efficient?software.


      - golang.org

      跟隨golang官網教程,學習Go語言基礎知識 - 包、變量和函數,參考鏈接https://tour.go-zh.org/list。Let's go!

      每個 Go 程序都是由包構成的。

      程序從?main?包開始運行。

      本程序通過導入路徑?"fmt"?和?"math/rand"?來使用這兩個包。

      按照約定,包名與導入路徑的最后一個元素一致。例如,"math/rand"?包中的源碼均以?package rand?語句開始。

      *注意:* 此程序的運行環境是固定的,因此?rand.Intn?總是會返回相同的數字。 (要得到不同的數字,需為生成器提供不同的種子數,參見?rand.Seed。 練習場中的時間為常量,因此你需要用其它的值作為種子數。)

      package?main import?( "fmt" "math/rand" ) func?main()?{ rand.Seed(2) fmt.Println("My?favorite?number?is",?rand.Intn(10)) } //?output My?favorite?number?is?6

      導入

      此代碼用圓括號組合了導入,這是“分組”形式的導入語句。

      當然你也可以編寫多個導入語句,例如:

      import?"fmt" import?"math"

      不過使用分組導入語句是更好的形式。

      package?main import?( "fmt" "math" ) func?main()?{ fmt.Printf("Now?you?have?%g?problems.\n",?math.Sqrt(7)) } //?output Now?you?have?2.6457513110645907?problems.

      導出名

      在 Go 中,如果一個名字以大寫字母開頭,那么它就是已導出的。例如,Pizza?就是個已導出名,Pi?也同樣,它導出自?math?包。

      pizza?和?pi?并未以大寫字母開頭,所以它們是未導出的。

      在導入一個包時,你只能引用其中已導出的名字。任何“未導出”的名字在該包外均無法訪問。

      package?main import?( "fmt" "math" ) func?main()?{ fmt.Println(math.Pi) } //?output 3.141592653589793

      函數

      函數可以沒有參數或接受多個參數。

      在本例中,add?接受兩個?int?類型的參數。

      注意類型在變量名?之后。好處:當類型聲明變得很復雜時,可以增加可讀性。

      package?main import?"fmt" func?add(x?int,?y?int)?int?{ return?x?+?y } func?main()?{ fmt.Println(add(42,?13)) } //?output?55

      當連續兩個或多個函數的已命名形參類型相同時,除最后一個類型以外,其它都可以省略。

      在本例中,

      x?int,?y?int

      被縮寫為

      x,?y?int

      package?main import?"fmt" //?函數參數屬于同一個類型,可只保留一個類型 func?add(x,?y?int)?int?{ return?x?+?y } func?main()?{ fmt.Println(add(42,?13)) }

      多值返回

      函數可以返回任意數量的返回值。

      swap?函數返回了兩個字符串。

      package?main import?"fmt" func?swap(x,?y?string)?(string,?string)?{ return?y,?x } func?main()?{ a,?b?:=?swap("hello",?"world") fmt.Println(a,?b) } //?output world?hello

      命名返回值

      Go 的返回值可被命名,它們會被視作定義在函數頂部的變量。

      返回值的名稱應當具有一定的意義,它可以作為文檔使用。

      沒有參數的?return?語句返回已命名的返回值。也就是?直接?返回。

      直接返回語句應當僅用在下面這樣的短函數中。在長的函數中它們會影響代碼的可讀性。

      package?main import?"fmt" func?split(sum?int)?(x,y?int){ x?=?sum?*?4?/?9 y?=?sum?-?x return?x,y } func?main()?{ fmt.Println(split(17)) } //?output 7?10

      變量

      var?語句用于聲明一個變量列表,跟函數的參數列表一樣,類型在最后。

      就像在這個例子中看到的一樣,var?語句可以出現在包或函數級別。

      package?main import?"fmt" var?c,?python,?java?bool func?main()?{ var?i?int fmt.Println(i,?c,?python,?java) } //?output 0?false?false?false

      初始化

      變量聲明可以包含初始值,每個變量對應一個。

      如果初始化值已存在,則可以省略類型;變量會從初始值中獲得類型。

      package?main import?"fmt" var?i,?j?int?=?1,?2 func?main()?{ var?c,?python,?java?=?true,?false,?"no!" fmt.Println(i,?j,?c,?python,?java) } //??output 1?2?true?false?no!

      短變量聲明

      在函數中,簡潔賦值語句?:=?可在類型明確的地方代替?var?聲明。

      函數外的每個語句都必須以關鍵字開始(var,?func?等等),因此?:=?結構不能在函數外使用。

      package?main import?"fmt" func?main()?{ var?i,?j?int?=?1,?2 k?:=?3 c,?python,?java?:=?true,?false,?"no!" fmt.Println(i,?j,?k,?c,?python,?java) } //?output 1?2?3?true?false?no!

      基本類型

      Go 的基本類型有

      bool string int??int8??int16??int32??int64 uint?uint8?uint16?uint32?uint64?uintptr byte?//?uint8?的別名 rune?//?int32?的別名 ????//?表示一個?Unicode?碼點 float32?float64 complex64?complex128

      本例展示了幾種類型的變量。 同導入語句一樣,變量聲明也可以“分組”成一個語法塊。

      int,?uint?和?uintptr?在 32 位系統上通常為 32 位寬,在 64 位系統上則為 64 位寬。 當你需要一個整數值時應使用?int?類型,除非你有特殊的理由使用固定大小或無符號的整數類型。

      格式占位符參考https://studygolang.com/articles/2644。

      package?main import?( "fmt" "math/cmplx" ) var?( ToBe???bool???????=?false MaxInt?uint64?????=?1<<64?-?1 z??????complex128?=?cmplx.Sqrt(-5?+?12i) ) func?main()?{ fmt.Printf("Type:?%T?Value:?%v\n",?ToBe,?ToBe) fmt.Printf("Type:?%T?Value:?%v\n",?MaxInt,?MaxInt) fmt.Printf("Type:?%T?Value:?%v\n",?z,?z) } //?output Type:?bool?Value:?false Type:?uint64?Value:?18446744073709551615 Type:?complex128?Value:?(2+3i)

      零值

      沒有明確初始值的變量聲明會被賦予它們的?零值。

      零值是:

      數值類型為?0,

      布爾類型為?false,

      字符串為?""(空字符串)。

      package?main import?"fmt" func?main()?{ var?i?int var?f?float64 var?b?bool var?s?string fmt.Printf("%v?%v?%v?%q\n",?i,?f,?b,?s) } //?output 0?0?false?""

      類型轉換

      表達式?T(v)?將值?v?轉換為類型?T。

      一些關于數值的轉換:

      var?i?int?=?42 var?f?float64?=?float64(i) var?u?uint?=?uint(f)

      或者,更加簡單的形式:

      Go語言基礎學習 - 包、變量、函數

      i?:=?42 f?:=?float64(i) u?:=?uint(f)

      與 C 不同的是,Go 在不同類型的項之間賦值時需要顯式轉換。試著移除例子中?float64?或?uint?的轉換看看會發生什么。

      package?main import?( "fmt" "math" ) func?main()?{ var?x,?y?int?=?3,?4 var?f?float64?=?math.Sqrt(float64(x*x?+?y*y)) var?z?uint?=?uint(f) fmt.Println(x,?y,?z) } //?output 3?4?5

      類型推導

      在聲明一個變量而不指定其類型時(即使用不帶類型的?:=?語法或?var =?表達式語法),變量的類型由右值推導得出。

      當右值聲明了類型時,新變量的類型與其相同:

      var?i?int j?:=?i?//?j?也是一個?int

      不過當右邊包含未指明類型的數值常量時,新變量的類型就可能是?int,?float64?或?complex128?了,這取決于常量的精度:

      i?:=?42???????????//?int f?:=?3.142????????//?float64 g?:=?0.867?+?0.5i?//?complex128

      嘗試修改示例代碼中?v?的初始值,并觀察它是如何影響類型的。

      package?main import?"fmt" func?main()?{ v?:=?4.221341234121234122?//?修改這里! fmt.Printf("v?is?of?type?%T\n",?v) } //?output v?is?of?type?float64

      常量

      常量的聲明與變量類似,只不過是使用?const?關鍵字。

      常量可以是字符、字符串、布爾值或數值。

      常量不能用?:=?語法聲明。

      package?main import?"fmt" const?Pi?=?3.14 func?main()?{ const?World?=?"世界" fmt.Println("Hello",?World) fmt.Println("Happy",?Pi,?"Day") const?Truth?=?true fmt.Println("Go?rules?",?Truth) } //?output Hello?世界 Happy?3.14?Day Go?rules??true

      數值常量

      數值常量是高精度的?值。

      一個未指定類型的常量由上下文來決定其類型。

      再嘗試一下輸出?needInt(Big)?吧。

      (int?類型最大可以存儲一個 64 位的整數,有時會更小。)

      (int?可以存放最大64位的整數,根據平臺不同有時會更少。)

      package?main import?"fmt" const?( //?將?1?左移?100?位來創建一個非常大的數字 //?即這個數的二進制是?1?后面跟著?100?個?0 Big?=?1?<>?99 ) func?needInt(x?int)?int?{?return?x*10?+?1?} func?needFloat(x?float64)?float64?{ return?x?*?0.1 } func?main()?{ fmt.Println(needInt(Small)) //?fmt.Println(needInt(Big)) fmt.Println(needFloat(Small)) fmt.Println(needFloat(Big)) } //?output 21 0.2 1.2676506002282295e+29

      Go語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何在wps表格中輸入日期時間
      下一篇:中國自主低代碼開發平臺(開源 低代碼開發平臺
      相關文章
      亚洲AV无码一区二区乱子伦| 亚洲国产精品成人久久| 亚洲av片劲爆在线观看| 久久久久亚洲精品中文字幕| 亚洲精品无码99在线观看 | 亚洲AV日韩精品久久久久久 | 亚洲1234区乱码| 亚洲国产夜色在线观看| 亚洲最大在线视频| 亚洲福利视频一区二区三区| 亚洲精品国产成人| 亚洲国产成人精品无码区在线网站| 久久久久亚洲av无码专区喷水| 亚洲成人动漫在线| 亚洲一区二区影院| 亚洲精品福利网泷泽萝拉| 亚洲最大黄色网址| 亚洲精品人成网在线播放影院| 亚洲愉拍一区二区三区| 亚洲日韩精品无码专区加勒比☆ | 亚洲乱理伦片在线观看中字| 亚洲国产成人手机在线观看| 色偷偷尼玛图亚洲综合| 亚洲AV中文无码乱人伦在线视色| 亚洲av午夜成人片精品电影| 中文字幕在亚洲第一在线 | 国产成人无码综合亚洲日韩| 久久久久久久尹人综合网亚洲| 久久青青成人亚洲精品| 亚洲日本中文字幕区| 亚洲无成人网77777| 亚洲高清一区二区三区| 青草久久精品亚洲综合专区| 精品亚洲成α人无码成α在线观看| 亚洲色欲色欲www在线丝| 亚洲国产天堂在线观看| 亚洲人成黄网在线观看| 亚洲女子高潮不断爆白浆| 夜色阁亚洲一区二区三区| 亚洲香蕉成人AV网站在线观看 | 久久久久无码精品亚洲日韩|