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/srcGOROOT/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

包的注意事項

  1. 包名建議跟目錄名保持一致,也可以不一致

    import "包名"

    這個包名,就是 package “包名” 定義的包名,跟目錄名字沒有關係,倘若 package 定義的名字跟目錄名不一致,引入包的時候,要以package定義的包名為準。

  2. package “包名” 必須在文件的第一行,然後再 import

  3. 引包路徑, GOPATH or GOROOT src目錄下, env.GO111MODULE

  4. 包裏面要暴露的函數,函數名必須大寫,表示可導出

  5. 如果包名比較長,go支持取別名,定義別名之後,原先的包名就不好使了

  6. 在同一個包下,不允許有相同的函數名

  7. 如果要編譯成一個可執行程序文件,就需要將這個包聲明為 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

熱愛前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的互聯網物聯網技術、數字化轉型、數字經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。