本文通過一個實現(xiàn)加減乘除運算的小程序來介紹go函數(shù)的使用诈唬,以及使用函數(shù)的注意事項,并引出了對包的了解和使用怎诫。
實現(xiàn)加減乘除運算
傳統(tǒng)方法實現(xiàn):
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)
以上代碼的問題:
需求變更虐唠,取模,代碼不夠靈活
不利于維護
代碼冗余
函數(shù)可以解決這個問題
封裝
傳參調用
返回值
函數(shù)基本語法
func 函數(shù)名 (形參列表) (返回值列表) {
執(zhí)行語句
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)
}
函數(shù)的問題
一個文件里出現(xiàn)超級多的函數(shù)
utils.go
文件少态,專門用于定義函數(shù)城侧,讓其它文件來調用,工具函數(shù)的封裝彼妻,
db.go
文件嫌佑,專門定義對數(shù)據(jù)庫操作的函數(shù)
main.go
文件,引入其它文件侨歉,使用工具函數(shù)屋摇, 代碼更專注
繼而引出包的概念,分門別類的使用幽邓,也有利于多人協(xié)同開發(fā)炮温,相同的函數(shù)名可以存在不同的包下面
包的原理
包的本質,實際上就是創(chuàng)建不同的文件夾牵舵,來存放程序文件茅特。
包的介紹
go的每一個文件都屬于一個包的,也就是說go以包的形式來管理文件和項目目錄結構的棋枕。
大寫字母開頭的標識符白修,表示該標識符可導出
作用:
區(qū)分相同名字的函數(shù)、變量等標識符
當程序文件很多時重斑,很好的管理項目
控制函數(shù)兵睛、變量的訪問范圍,即作用域
語法
package util
引入使用(封裝實現(xiàn)加減乘除的工具函數(shù))
包名.函數(shù)名
省略 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
包里面要暴露的函數(shù)激涤,函數(shù)名必須大寫拟糕,表示可導出
如果包名比較長,go支持取別名倦踢,定義別名之后送滞,原先的包名就不好使了
在同一個包下,不允許有相同的函數(shù)名
如果要編譯成一個可執(zhí)行程序文件辱挥,就需要將這個包聲明為 main
進入項目根目錄(go build的執(zhí)行環(huán)境就是運行命令的目錄)犁嗅,
go build go_code/fndemo1/main
, 在根目錄會生成main.exe
可執(zhí)行文件
go build -o bin/my.exe go_code/fndemo1/main
, -o
表示輸出的目錄般贼,沒有則會自動創(chuàng)建
import (
"fmt"
util "go_code/fndemo1/utils"
)
// 使用
util.Calc()
我是 甜點cc
熱愛前端開發(fā)愧哟,也喜歡專研各種跟本職工作關系不大的技術,技術哼蛆、產品興趣廣泛且濃厚蕊梧。本號主要致力于分享個人經驗總結,希望可以給一小部分人一些微小幫助腮介。
希望能和大家一起努力營造一個良好的學習氛圍肥矢,為了個人和家庭、為了我國的互聯(lián)網物聯(lián)網技術叠洗、數(shù)字化轉型甘改、數(shù)字經濟發(fā)展做一點點貢獻。數(shù)風流人物還看中國灭抑、看今朝十艾、看你我。