GoLang 之旅(一)
输出Hello World
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
导入math/rand包输出随机数
package main import ( "fmt" "math/rand" ) func main() { fmt.Println("My favorite number is", rand.Intn(10)) }
导入math包使用开根号功能
package main import ( "fmt" "math" ) func main() { fmt.Printf("Now you have %g problems.\n", math.Sqrt(7)) }
已导出的包要大写
package main import ( "fmt" "math" ) func main() { fmt.Println(math.Pi) }
函数传参数
package main import "fmt" func add(x int, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) }
函数传多个参数,除最后一个参数意外,其他参数类型可以省略
package main import "fmt" func add(x, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) }
函数可以返回任意数量的值
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) }
命名返回值,直接返回的语句,可以返回已命名的返回值
package main import "fmt" func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } func main() { fmt.Println(split(17)) }
// 输出 7 10
var声明变量列表
package main import "fmt" var c, python, java bool func main() { var i int fmt.Println(i, c, python, java) }
输出 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) }
输出 1 2 true false no!
短变量声明,类型明确的情况下可用,:= 只能在函数内使用
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) }
输出 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
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) }
输出
Type: bool Value: false
Type: uint64 Value: 18446744073709551615
Type: complex128 Value: (2+3i)
零值,未被赋值的地方会赋予零值
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) }
输出 0 0 false ""
类型转换
表达式 T(v)
将值 v
转换为类型 T
。
一些关于数值的转换:
var i int = 42 var f float64 = float64(i) var u uint = uint(f)
或者,更加简单的形式:
i := 42 f := float64(i) u := uint(f)
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) }
输出 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
package main import "fmt" func main() { v := 42 // 修改这里! fmt.Printf("v is of type %T\n", v) }
输出 v is of type int
常量,关键字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) }
输出
Hello 世界
Happy 3.14 Day
Go rules? true
数值常量
数值常量是高精度的 值
一个未指定类型的常量由上下文来决定其类型
int
类型最大可以存储一个 64 位的整数,有时会更小
package main import "fmt" const ( // 将 1 左移 100 位来创建一个非常大的数字 // 即这个数的二进制是 1 后面跟着 100 个 0 Big = 1 << 100 // 再往右移 99 位,即 Small = 1 << 1,或者说 Small = 2 Small = 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)) }
// 输出
// 21 // 0.2 // 1.2676506002282295e+29
论读书
睁开眼,书在面前 闭上眼,书在心里
睁开眼,书在面前 闭上眼,书在心里