包package是源碼(.go文件)的集合。
package 包名
注意:
- 一個文件夾下面只能有一個包,同樣一個包的文件不能改在多個文件夾下。
- 包名和文件夾名可以不一樣,包名不能包括-符號。
- 包名為main的包為應(yīng)用程序的入口包,編譯時不包含main包的源代碼時不會得到可執(zhí)行文件。
如果想在一個包中引用另一個包里的標識符(如變量、常量、類型、函數(shù)等),該標識符必須是對外可見的(public)。在Go語言中只需要將標識符的首字母大寫就可以讓標識符對外可見。
包的導入
import "包的路徑"
注意:
- import導入語句通常放到文件開頭包聲明語句的下面。
- 導入的包名需要使用
雙引號包裹起來。 - 報名是從
$GOPATH/src后開始計算的,使用/進行路徑分隔。
import "包名1"
import (
"包名2" //系統(tǒng)包
"包名3" //自定義包
)
示例代碼:
自定義包名
package 別名 包名
匿名導入包
只希望導入包,而不使用包內(nèi)部的數(shù)據(jù)。
匿名導入的包與其它導入的包一樣都會編譯到可執(zhí)行過文件中。
package _ "包的路徑"
init()初始化函數(shù)
Go語言在導入包時候自動出發(fā)內(nèi)部的init()函數(shù)調(diào)用。
init()函數(shù)沒有參數(shù)也沒有返回值,在程序中自動調(diào)用執(zhí)行,不能主動去調(diào)用。

image.png
導入包順序

image.png
Demo
目錄結(jié)構(gòu)是src/code/lvdx6/com/backend/testproject下的main和test目錄

image.png
- main目錄下的main.go
package main
import (
"fmt"
"code/lvdx6/com/backend/testproject/test"
)
func init(){
fmt.Println("main package main.go init()")
}
func main(){
fmt.Println("main package main.go調(diào)用test package的test.go中的方法")
test.Test()
fmt.Println("main package main.go調(diào)用同一個包下的haha.go中的方法")
Haha()
}
- main目錄下的haha.go
package main
import "fmt"
func init() {
fmt.Println("main package haha.go init()")
}
func Haha() {
fmt.Println("main package haha.go")
}
- test目錄下的test.go
package test
import "fmt"
func init() {
fmt.Println("test package test.go init()")
}
func Test() {
fmt.Println("test package test.go")
}
- 輸出結(jié)果是
# go run main.go haha.go
test package test.go init()
main package main.go init()
main package haha.go init()
main package main.go調(diào)用test package的test.go中的方法
test package test.go
main package main.go調(diào)用同一個包下的haha.go中的方法
main package haha.go
time包
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Printf("當前時間是:%#v\n", now)
year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
//獲取納秒
// ns := now.Nanosecond()
fmt.Printf("當前時間是:%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
輸出結(jié)果是
當前時間是:time.Time{wall:0xbfafe8044ab66a98, ext:5005601, loc:(*time.Location)(0x58bb80)}
當前時間是:2020-06-09 14:13:37
時間戳
從1970年1月1日(08:00:00GMT)至當前時間的總毫秒數(shù),也被成為Unix時間戳(UnixTimestamp)。
使用time.Unix()函數(shù)將時間戳轉(zhuǎn)為時間格式。
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Printf("當前時間是:%#v\n", now)
//獲取時間戳
timestamp1 := now.Unix()
timestamp2 := now.UnixNano()
fmt.Printf("當前時間戳是:%#v\n", timestamp1)
fmt.Printf("當前時間戳(納秒)是:%#v\n", timestamp2)
//使用time.Unix()函數(shù)講時間戳轉(zhuǎn)為時間格式
timeObj := time.Unix(timestamp1, 0)
fmt.Println(timeObj)
fmt.Printf("使用time.Unix()函數(shù)講時間戳轉(zhuǎn)為時間格式是:%#v\n", timeObj)
fmt.Printf("當前時間是:%d-%02d-%02d %02d:%02d:%02d\n", timeObj.Year(), timeObj.Month(), timeObj.Day(), timeObj.Hour(), timeObj.Minute(), timeObj.Second())
}
時間格式化
使用Format進行格式化,不是常見的Y-m-d H:M:S格式化,而是使用Go的誕生時間2006年1月2號15點04分(2006 1 2 3 4)。
- 2006表示年
- 1、01表示月,帶0表示2位數(shù),不帶0是原始
- 2、02表示日,帶0表示2位數(shù),不帶0是原始
- 15表示小時
- 4、04表示分,帶0表示2位數(shù),不帶0是原始
- 5、05表示秒,帶0表示2位數(shù),不帶0是原始
- 000、999表示納秒
package main
import (
"fmt"
"time"
)
func main(){
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Format("2006-1-2 15:4:5"))
fmt.Println(now.Format("2006/01/02 15:04:05"))
fmt.Println(now.Format("15:04:05 2006/01/02"))
fmt.Println(now.Format("2006/01/02"))
// 納秒
fmt.Println(now.Format("2006-01-02 15:04:05.000"))
fmt.Println(now.Format("2006-01-02 15:04:05.999"))
}
輸出結(jié)果是
2020-06-09 16:47:19
2020-6-9 16:47:19
2020/06/09 16:47:19
16:47:19 2020/06/09
2020/06/09
2020-06-09 16:47:19.575
2020-06-09 16:47:19.575
定時器
使用time.Tick(時間間隔)來設(shè)置定時器。
package main
import (
"fmt"
"time"
)
func main(){
//定義一個1秒間隔的定時器
ticker := time.Tick(time.Second)
for i := range ticker {
//每秒都會執(zhí)行的任務(wù)
func(){
fmt.Println(i)
}()
}
}
時間間隔
Duration類型代表兩個時間點之間經(jīng)過的時間,以納秒為單位??杀硎镜淖铋L時間段大約為290年。定義的時間間隔常量如下:
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
time小練習
package main
import (
"fmt"
"time"
)
func formatTime(t time.Time) string {
return t.Format("2006/01/02 15:04:05")
}
//計算一段代碼執(zhí)行微秒數(shù)
func calTime() {
//方法一:
start := time.Now().UnixNano() / 1000
time.Sleep(time.Millisecond * 30)
end := time.Now().UnixNano() / 1000
fmt.Printf("耗費了%d微秒\n", end - start)
//方法二:
start2 := time.Now()
time.Sleep(time.Millisecond * 30)
fmt.Printf("耗費了%d微秒\n", time.Since(start2) / 1000)
}
func main(){
now := time.Now()
newTime := formatTime(now)
fmt.Println(newTime)
calTime()
}
輸出結(jié)果是
2020/06/09 19:34:05
耗費了30020微秒
耗費了30040微秒