Golang——包

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微秒
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容