Go | 函數(包)的使用
本文通過一個實現加減乘除運算的小程序來介紹go函數的使用,以及使用函數的注意事項,並引出了對包的了解和使用。
實現加減乘除運算
傳統方法實現:
var n1 float64 = 1.2
var n2 float64 = 2.1
var opt byte = '+'
var res float64
switch opt {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
case '*':
res = n1 * n2
case '/':
res = n1 / n2
default:
fmt.Println("不合法的運算符")
}
fmt.Printf("res=%v", res)
以上代碼的問題:
-
需求變更,取模,代碼不夠靈活
-
不利於維護
-
代碼冗餘
函數可以解決這個問題
-
封裝
-
傳參調用
-
返回值
函數基本語法
func 函數名 (形參列表) (返回值列表) {
執行語句
return 返回值列表
}
上面代碼改寫:
func calc(n1 float64, n2 float64, opt byte) float64 {
var res float64
switch opt {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
case '*':
res = n1 * n2
case '/':
res = n1 / n2
default:
fmt.Println("不合法的運算符")
}
return res
}
func main() {
fmt.Println("hello fn")
var n1 float64 = 1.2
var n2 float64 = 2.1
var opt byte = '+'
var result float64 = calc(n1, n2, opt)
fmt.Printf("%T %v \n", result, result)
}
函數的問題
一個文件里出現超級多的函數
utils.go
文件,專門用於定義函數,讓其它文件來調用,工具函數的封裝,
db.go
文件,專門定義對數據庫操作的函數
main.go
文件,引入其它文件,使用工具函數, 代碼更專註
繼而引出包的概念,分門別類的使用,也有利於多人協同開發,相同的函數名可以存在不同的包下面
包的原理
包的本質,實際上就是創建不同的文件夾,來存放程序文件。
包的介紹
go的每一個文件都屬於一個包的,也就是說go以包的形式來管理文件和項目目錄結構的。
大寫字母開頭的標識符,表示該標識符可導出
作用:
-
區分相同名字的函數、變量等標識符
-
當程序文件很多時,很好的管理項目
-
控制函數、變量的訪問範圍,即作用域
語法
package util
引入使用(封裝實現加減乘除的工具函數)
包名.函數名
省略 GOPATH/src
或 GOROOT/src
,前提是在 env.GO111MODULE=off
的情況下
import "包的路徑"
// GOPATH or GOROOT src, env.GO111MODULE=off
- utils/utils.go 文件
package utils
import "fmt"
// 標識符大寫,表示可導出
func Calc(n1 float64, n2 float64, opt byte) float64 {
var res float64
switch opt {
case '+':
res = n1 + n2
case '-':
res = n1 - n2
case '*':
res = n1 * n2
case '/':
res = n1 / n2
default:
fmt.Println("不合法的運算符")
}
return res
}
- main/main.go 文件
import (
"fmt"
"go_code/fndemo1/utils"
)
func main() {
var n1 float64 = 1.233
var n2 float64 = 2.111
var opt byte = '+'
var result float64 = utils.Calc(n1, n2, opt)
fmt.Printf("%T %.2f= \n", result, result)
}
// %.2f 默認寬度,精度2
// float64 3.34
包的注意事項
-
包名建議跟目錄名保持一致,也可以不一致
import "包名"
這個包名,就是 package “包名” 定義的包名,跟目錄名字沒有關係,倘若 package 定義的名字跟目錄名不一致,引入包的時候,要以package定義的包名為準。
-
package “包名” 必須在文件的第一行,然後再 import
-
引包路徑, GOPATH or GOROOT src目錄下,
env.GO111MODULE
-
包裏面要暴露的函數,函數名必須大寫,表示可導出
-
如果包名比較長,go支持取別名,定義別名之後,原先的包名就不好使了
-
在同一個包下,不允許有相同的函數名
-
如果要編譯成一個可執行程序文件,就需要將這個包聲明為 main
進入項目根目錄(go build的執行環境就是運行命令的目錄),
go build go_code/fndemo1/main
, 在根目錄會生成main.exe
可執行文件
go build -o bin/my.exe go_code/fndemo1/main
, -o
表示輸出的目錄,沒有則會自動創建
import (
"fmt"
util "go_code/fndemo1/utils"
)
// 使用
util.Calc()
我是 甜點cc
熱愛前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。
希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。