包
概念
每个 Go 程序都是由包构成的,程序从 main 包开始运行。
约定:包名与导入路径的最后一个元素一致。比如,"math/rand" 包中的源码均以 package rand 语句开始。
本程序导入路径 "fmt"、"math/rand"、"time" 来使用这三个包,用来获取打印输出、生成随机数、时间相关的功能。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 设置随机数种子
var seedNum int64 = time.Now().UnixNano()
rand.Seed(seedNum)
// 取5次随机数序列
for i := 0; i < 5; i++ {
fmt.Printf("My number is %v\n", rand.Intn(100))
}
fmt.Println()
// 睡眠一秒为了生成新的随机数种子
time.Sleep(time.Second)
// 设置新随机数种子
seedNum = time.Now().UnixNano()
rand.Seed(seedNum)
for i := 0; i < 5; i++ {
fmt.Printf("My number is %v\n", rand.Intn(100))
}
}
导入
导入语法如下:
// 第一种:使用分组导入语句,更推荐
import (
"fmt"
"math"
"time"
)
// 编写多个导入语句
import "fmt"
import "math"
import "time"
导出名
在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的,即外部可以进行使用的。
比如:math 包下的 Pi。
package main
import (
"fmt"
"math"
)
func main() {
// 正确
fmt.Println(math.Pi)
// 错误:undefined: math.pi
// fmt.Println(math.pi)
}
函数
函数定义格式
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
比如:定义加法计算的函数 add。
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func main() {
fmt.Println(add(10, 20))
}
PS:当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略,比如: func add(a , b int) int { }
多值返回
函数可以返回任意数量的返回值,比如:同时计算 a、b 两数的和与差值。
package main
import "fmt"
func sumAndSub(a int, b int) (int,int) {
var sum = a + b
var sub = a - b
return sum, sub
}
func main() {
sum, sub := sumAndSub(20, 10)
fmt.Printf("a和b的和为: %v, 差为: %v",sum, sub)
}
命名返回值
Go 的返回值可被命名,它们会被视作定义在函数顶部的变量。直接返回就是没有参数的 return 语句返回已命名的返回值。
好处:如果返回值的名称应当具有一定的明确意义,那么它可以作为文档提供给代码阅读者。
比如以上代码可以调整成:
package main
import "fmt"
func sumAndSub(a int, b int) (sum int, sub int) {
sum = a + b
sub = a - b
return
}
func main() {
sum, sub := sumAndSub(20, 10)
fmt.Printf("a和b的和为: %v, 差为: %v", sum, sub)
}
变量
变量的定义
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用 var 关键字,请注意变量的类型在最后:
var identifier type
// 一次定义多个变量
var identifier1, identifier2 type
var 语句可以出现在包或函数级别:
package main
import "fmt"
var c, java bool
func main() {
var num = 0
fmt.Println(c, java, num)
}
变量的初始化
变量未设置值的话则默认是该值类型的零值(比如int就是0、bool 就是 false),然后我们还可以给变量设置初始化的值。
零值是: 数值类型为 0, 布尔类型为 false, 字符串为 ""(空字符串)。
package main
import "fmt"
var c, java bool = true,true
func main() {
var num = 10
fmt.Println(c, java, num)
}
短变量声明
在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。 但是 := 结构不能在函数外使用,原因是函数外的每个语句都必须以关键字开始(var, func 等等)
package main
import "fmt"
// 这里只能用 var
var c, java bool = true,true
func main() {
num := 10
fmt.Println(c, java, num)
}
基本类型
Go 的基本类型有
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
// uint8 的别名
byte
// int32 的别名
// 表示一个 Unicode 码点
rune
float32 float64
complex64 complex128
经验:
- 默认整数是 int、小数是 float64 类型
- 当你需要一个整数值时应使用 int 类型,除非有特殊的理由使用固定大小或无符号的整数类型。
- 没有明确初始值的变量声明会被赋予它们的零值。
类型转换
类型转换:表达式 T(v) 将值 v 转换为类型 T。 比如:
var i int = 10
var f float64 = float64(i)
var u uint = uint(f)
// 或者更简洁
i := 10
f := float64(i)
u := uint(f)
类型推导
概念:在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导可以得出。
当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128 了,这取决于常量的精度:
// i 由类型推导得出是一个int类型
i := 10
// float64
f := 3.142
// complex128
g := 0.867 + 0.5i
当右值声明了类型时,新变量的类型与其相同:
var i int
// j 也是一个 int
j := i
常量
常量的声明与变量类似,只不过是使用 const 关键字。常量可以是字符、字符串、布尔值或数值。 注意:常量不能用 := 语法声明。
package main
import "fmt"
const Pi = 3.14159
func main() {
const World = "World"
fmt.Println("Hello", World)
fmt.Println("Pi=", Pi)
}
请关注公众号【Java千练】,更多干货文章等你来看!