本文通过一个实现加减乘除运算的小程序来介绍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
热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。