iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Software Development

你知道Go是什麼嗎?系列 第 11

Day11 - 套件(Package)- Golang

  • 分享至 

  • xImage
  •  

耶耶,開始第二個十天了,今天要講的是套件,其實想直接往實做的方向學,但發現不會的東西太多了,所以還是多講一下基礎的東西ˊˇˋ

Packages

所有Go程式都是由套件組成的,到目前為止也用過了一些套件,fmtmath。當然也可以創建自己的package

特性

package分為兩種:

  • executable package(執行包):是用來產生我們可以執行的檔案,一定會包含 package main 並且帶有名為 main 的函式,不能被其他檔案給匯入。
  • reusable package(工具包):常稱作 library / dependency,目的是可以放入可重複使用的程式邏輯,它是不能被直接執行的,用作給執行包的擴充功能。

package的特性:

  • 同個目錄下的同層檔案屬於同一package
  • 通常package名稱會與目錄名稱一樣
  • main package是程式的進入點
  • 命名通常為名詞,純小寫

匯入套件

// 個別匯入
import "fmt"
import . "sample-app/count"
import name "sample-app/count"
import _ "sample-app/count"

//多航匯入
import (
    "fmt"
    . "sample-app/count"
    a "sample-app/count"
    _ "sample-app/count"
)
  • fmt,與Go一併安裝的套件,會從$GOROOT/src尋找並匯入
  • 引入自己寫的套件時又有三種方式,
    • .:會將整個package的方法都放入這隻檔案中,可直接使用count內的function()
    • a:將引入的套件轉換成自己取的別名,使用法為a.function()
    • _:不會使用到這個package,但會init這個套件

匯出套件元件

Go語言比較特殊,不會在宣告時宣告publicprivate,而是直接以大小寫來區分,在套件內的變數或方法若以大寫開頭,則視為public,可以從外部取用;若是小寫則為private,不能從外部取用,只能在package內使用。

試做一個套件

寫一個可以計算平均值與中位數的套件,先建立個statistic資料夾,並建立statistic.go檔案,內有兩方法Sum()Median()

package statistic

func Sum(arr []int) int {
    sum := 0
    for _, v := range arr {
    	sum += v
    }
    return sum
}

func Median(arr []int) float64 {
    if len(arr)%2 == 0 {
    	return float64(arr[len(arr)/2-1]+arr[len(arr)/2]) / 2
    } else {
    	return float64(arr[len(arr)/2])
    }
}

接著在main.go裡面匯入並使用

package main

import (
    "fmt"
    statis "sample-app/statistic" // 匯入套件並命名為statis
)

func main() {
    arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    fmt.Printf("%8s %d\n", "Mean: ", statis.Sum(arr))
    fmt.Printf("%8s %.1f\n", "Median: ", statis.Median(arr))
}

output:

Mean: 55
Median: 5.5

可以直接使用statis.去呼叫並使用套件內的方法,在套件內的方法命名都以大寫為開頭,這樣才能從外部取得,下面寫一個錯誤的來舉例

statistic.go加入以下程式碼

func test() {
	fmt.Println("Hello world!")
}

回主程式執行看看

func main() {
    statis.test()
}

啊,報錯了,畢竟是屬於private的東西

init

初始化程式,在套件被匯入時就會先執行,若在main裡面寫init,也會優先於main()先跑一遍,簡單介紹一下就好ˊˇˋ

寫兩個package分別為package1package2

package package1

import "fmt"

func init(){
    fmt.Println("Init package1.")
}
package package2

import "fmt"

func init(){
    fmt.Println("Init package2.")
}

main.go裡面測試

package main

import (
    "fmt"
    _ "sample-app/package1"
    _ "sample-app/package2"
)

func init() {
    fmt.Println("main init")
}

func main() {
    fmt.Println("Hello")
}

output:
Init package1.
Init package2.
main init
Hello

這樣就能看出每個init的執行順序。因為init不會經過確認,而會在建立時就直接執行,因此要小心操作init


耶,今天的介紹到此結束,稍微有點架構的概念出來了,再來就是沒有規劃的學習了,也不確定明天的內容是什麼,讚讚

參考資料

Packages
https://go.dev/tour/basics/1

Package 使用多個套件之前必須要懂的包
https://ithelp.ithome.com.tw/articles/10216224

day17 - 套件
https://ithelp.ithome.com.tw/articles/10219372

Golang package
https://ithelp.ithome.com.tw/articles/10206206

[Golang] Modules and Packages
https://pjchender.dev/golang/modules-and-packages/


上一篇
Day10 - 介面(interface)- Golang
下一篇
Day12 - Goroutine - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言