Go | 函数(包)的使用

本篇收录至Golang专栏,持续更新,欢迎访问😊

本文通过一个实现加减乘除运算的小程序来介绍go函数的使用,以及使用函数的注意事项,并引出了对包的了解和使用。

实现加减乘除运算

传统方法实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 返回值列表

}

上面代码改写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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以包的形式来管理文件和项目目录结构的。

大写字母开头的标识符,表示该标识符可导出

作用:

  • 区分相同名字的函数、变量等标识符

  • 当程序文件很多时,很好的管理项目

  • 控制函数、变量的访问范围,即作用域

语法

1
package util

引入使用(封装实现加减乘除的工具函数)

包名.函数名

省略 GOPATH/srcGOROOT/src,前提是在 env.GO111MODULE=off 的情况下

1
2
import "包的路径"
// GOPATH or GOROOT src, env.GO111MODULE=off
  • utils/utils.go 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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表示输出的目录,没有则会自动创建

1
2
3
4
5
6
import (
"fmt"
util "go_code/fndemo1/utils"
)
// 使用
util.Calc()

我是 甜点cc

热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。