溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

go語(yǔ)言碎片整理之包

發(fā)布時(shí)間:2020-07-23 23:06:08 來(lái)源:網(wǎng)絡(luò) 閱讀:531 作者:霍帥兵 欄目:編程語(yǔ)言

在工程化的Go語(yǔ)言開(kāi)發(fā)項(xiàng)目中,Go語(yǔ)言的源碼復(fù)用是建立在包(package)基礎(chǔ)之上的,本文介紹了go語(yǔ)言中如何定義包,如何導(dǎo)出包的內(nèi)容以及如何導(dǎo)入其他包。

包介紹

包(package)是多個(gè)Go源碼的集合,是一種高級(jí)的代碼復(fù)用方案,go語(yǔ)言為我們提供了很多的內(nèi)置包,如fmt、os、io等。

定義包

我們還可以根據(jù)自己的需要?jiǎng)?chuàng)建自己的包,一個(gè)包可以簡(jiǎn)單理解為一個(gè)存放.go文件的文件夾。該文件夾下面的所有g(shù)o文件都要在代碼的第一行添加如下代碼,聲明該文件歸屬包。

package 包名

注意事項(xiàng):
1、一個(gè)文件夾下只能有一個(gè)包,同樣一個(gè)包的文件不能在多個(gè)文件夾下。
2、包名可以不和文件夾的名字一樣,包名不能包含-符號(hào)
3、包名為main的包為應(yīng)用程序的入口包,編譯時(shí)不包含main包的源代碼時(shí)不會(huì)得到可執(zhí)行文件。

可見(jiàn)性

如果想在一個(gè)包中引用另外一個(gè)包里的標(biāo)識(shí)符(如變量、常量、類(lèi)型、函數(shù)等),該標(biāo)識(shí)符必須是對(duì)外可見(jiàn)的(public)。在go語(yǔ)言中只需要將標(biāo)識(shí)符的首字母大寫(xiě)就可以讓標(biāo)識(shí)符對(duì)外可見(jiàn)。
舉個(gè)例子,我們定義一個(gè)包名為pkg2的包,代碼如下:

var a = 100

const Mode = 1

type person struct {
    name string
}

func Add(x, y int) int {
    return x + y
}
func age() {
    var Age = 18
    fmt.Println(Age)
}

結(jié)構(gòu)體中的字段名和接口中的方法名如果首字母都是大寫(xiě),外部包可以訪(fǎng)問(wèn)這個(gè)字段和方法,例如:

type Student struct {
    Name string
    class string
}
type Payer interface{
    init()
    Pay()
}

包的導(dǎo)入

要在代碼中引用其他包的內(nèi)容,需要使用import 關(guān)鍵字導(dǎo)入使用的包。具體語(yǔ)法如下:

import "包的路徑"

注意事項(xiàng):

  • import導(dǎo)入語(yǔ)句通常放在文件開(kāi)頭包聲明語(yǔ)句下面。
  • 導(dǎo)入的包名需要使用雙引號(hào)包裹起來(lái)。
  • 包名是從$GOPATH/src/后開(kāi)始計(jì)算的,使用/進(jìn)行路徑分割。
  • Go語(yǔ)言中禁止循環(huán)導(dǎo)入包。

自定義包名

在導(dǎo)入包名的時(shí)候,我們還可以為導(dǎo)入的包名設(shè)置別名。具體格式如下:

import 別名  "包的路徑"

多行導(dǎo)入方式定義別名:

import (
    "fmt"
    m "github.com/Q1mi/studygo/pkg_test"
)
func main(){
    fmt.Println(m.Add(100,200))
    fmt.Println(m.Mode)
}

匿名導(dǎo)入包

如果只希望導(dǎo)入包,而不使用包內(nèi)部的數(shù)據(jù)時(shí),可以使用匿名導(dǎo)入包。具體的格式如下:

import _  "包的路徑"

匿名導(dǎo)入的包與其他方式導(dǎo)入的包一樣都會(huì)被編譯到可執(zhí)行文件中。

init()初始化函數(shù)

init()函數(shù)介紹

在Go語(yǔ)言程序執(zhí)行時(shí)導(dǎo)入包語(yǔ)句會(huì)自動(dòng)觸發(fā)包內(nèi)部init()函數(shù)的調(diào)用,需要注意的是:init()函數(shù)沒(méi)有參數(shù)也沒(méi)有返回值。init()函數(shù)在程序運(yùn)行時(shí)自動(dòng)被調(diào)用執(zhí)行,不能在代碼中主動(dòng)調(diào)用它。
包初始化執(zhí)行的順序如下圖所示:

go語(yǔ)言碎片整理之包

init()函數(shù)執(zhí)行順序

Go語(yǔ)言包會(huì)從main包開(kāi)始檢查其導(dǎo)入的所有包,每個(gè)包中又可能導(dǎo)入了其他包,Go編譯器由此構(gòu)建出一個(gè)樹(shù)狀的包引用關(guān)系,再根據(jù)引用順序決定編譯順序,依次編譯這些包的代碼。
在運(yùn)行時(shí),被最后導(dǎo)入的包會(huì)最先初始化并調(diào)用其init()函數(shù),如下圖示:
go語(yǔ)言碎片整理之包

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI