標籤:blog http java 使用 os strong io art
Packages
每個 Go 程式都是由包組成的。
程式啟動並執行入口是包 `main`。
這個程式使用並匯入了包 "fmt"
和 `"math/rand"`。
按照慣例,包名與匯入路徑的最後一個目錄一致。例如,`"math/rand"` 包由 package rand
語句開始。
注意: 這個程式的運行環境是固定的,因此 rand.Intn
總是會返回相同的數字。 (為了得到不同的數字,需要產生不同的種子數,參閱 rand.Seed
。)
package mainimport ("fmt""math/rand")func main() {fmt.Println("My favorite number is", rand.Intn(10))}
匯入
這個代碼用圓括弧組合了匯入,這是“factored”匯入語句。同樣可以編寫多個匯入語句,例如:
import "fmt"import "math"
package mainimport ("fmt""math")func main() {fmt.Printf("Now you have %g problems.",math.Nextafter(2, 3))}
匯出名
在匯入了一個包之後,就可以用其匯出的名稱來調用它。
在 Go 中,首字母大寫的名稱是被匯出的。
Foo
和 FOO
都是被匯出的名稱。名稱 foo
是不會被匯出的。
執行代碼。然後將 math.pi
改名為 math.Pi
再試著執行一下。
package mainimport ("fmt""math")func main() {fmt.Println(math.pi)}
函數
函數可以沒有參數或接受多個參數。
在這個例子中,`add` 接受兩個 int
類型的參數。
注意類型在變數名 _之後_。
(參考 這篇關於 Go 文法定義的文章瞭解類型以這種形式出現的原因。)
package mainimport "fmt"func add(x int, y int) int {return x + y}func main() {fmt.Println(add(42, 13))}
函數(續)
當兩個或多個連續的函數具名引數是同一類型,則除了最後一個類型之外,其他都可以省略。
在這個例子中 ,
x int, y int
被縮寫為
x, y int
package mainimport "fmt"func add(x, y int) int {return x + y}func main() {fmt.Println(add(42, 13))}
多值返回
函數可以返回任意數量的傳回值。
這個函數返回了兩個字串。
package mainimport "fmt"func swap(x, y string) (string, string) {return y, x}func main() {a, b := swap("hello", "world")fmt.Println(a, b)}
命名傳回值
函數接受參數。在 Go 中,函數可以返回多個“結果參數”,而不僅僅是一個值。它們可以像變數那樣命名和使用。
如果命名了傳回值參數,一個沒有參數的 return
語句,會將當前的值作為傳回值返回。
package mainimport "fmt"func split(sum int) (x, y int) {x = sum * 4 / 9y = sum - xreturn}func main() {fmt.Println(split(17))}
變數
var
語句定義了一個變數的列表;跟函數的參數列表一樣,類型在後面。
package mainimport "fmt"var i intvar c, python, java boolfunc main() {fmt.Println(i, c, python, java)}
初始設定變數
變數定義可以包含初始值,每個變數對應一個。
如果初始化是使用運算式,則可以省略類型;變數從初始值中獲得類型。
package mainimport "fmt"var i, j int = 1, 2var c, python, java = true, false, "no!"func main() {fmt.Println(i, j, c, python, java)}
短聲明變數
在函數中,`:=` 簡潔指派陳述式在明確類型的地方,可以用於替代 var
定義。
函數外的每個文法塊都必須以關鍵字開始(`var`、`func`、等等),`:=` 結構不能使用在函數外。
package mainimport "fmt"func main() {var i, j int = 1, 2k := 3c, python, java := true, false, "no!"fmt.Println(i, j, k, c, python, java)}
基本類型
Go 的基本類型有Basic types
boolstringint int8 int16 int32 int64uint uint8 uint16 uint32 uint64 uintptrbyte // uint8 的別名rune // int32 的別名// 代表一個Unicode碼float32 float64complex64 complex128
package mainimport ("fmt""math/cmplx")var (ToBe bool = falseMaxInt uint64 = 1<<64 - 1z complex128 = cmplx.Sqrt(-5 + 12i))func main() {const f = "%T(%v)\n"fmt.Printf(f, ToBe, ToBe)fmt.Printf(f, MaxInt, MaxInt)fmt.Printf(f, z, z)}
類型轉換
運算式 T(v)
將值 v
轉換為類型 `T`。
一些關於數值的轉換:
var i int = 42var f float64 = float64(i)var u uint = uint(f)
或者,更加簡單的形式:
i := 42f := float64(i)u := uint(f)
與 C 不同的是 Go 的在不同類型之間的項目賦值時需要顯式轉換。 試著移除例子中float64
或 int
的轉換看看會發生什麼。
package mainimport ("fmt""math")func main() {var x, y int = 3, 4var f float64 = math.Sqrt(float64(x*x + y*y))var z int = int(f)fmt.Println(x, y, z)}
常量
常量的定義與變數類似,只不過使用 const
關鍵字。
常量可以是字元、字串、布爾或數字類型的值。
常量不能使用 :=
文法定義。
package mainimport "fmt"const Pi = 3.14func main() {const World = "世界"fmt.Println("Hello", World)fmt.Println("Happy", Pi, "Day")const Truth = truefmt.Println("Go rules?", Truth)}
數值常量
數值常量是高精度的 _值_。
一個未指定類型的常量由上下文來決定其類型。
也嘗試一下輸出 needInt(Big)
吧。
package mainimport "fmt"const (Big = 1 << 100Small = Big >> 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(needFloat(Small))fmt.Println(needFloat(Big))}