实现加减乘除运算

1、传统方法实现

  1. var n1 float64 = 1.2
  2. var n2 float64 = 2.1
  3. var opt byte = '+'
  4. var res float64
  5. switch opt {
  6. case '+':
  7. res = n1 + n2
  8. case '-':
  9. res = n1 - n2
  10. case '*':
  11. res = n1 * n2
  12. case '/':
  13. res = n1 / n2
  14. default:
  15. fmt.Println("不合法的运算符")
  16. }
  17. fmt.Printf("res=%v", res)

以上代码的问题:

  • 需求变更,取模,代码不够灵活
  • 不利于维护
  • 代码冗余

函数可以解决这个问题

  • 封装
  • 传参调用
  • 返回值

函数基本语法

func 函数名 (形参列表) (返回值列表) {
执行语句
return 返回值列表
}

上面代码改写:

  1. func calc(n1 float64, n2 float64, opt byte) float64 {
  2. var res float64
  3. switch opt {
  4. case '+':
  5. res = n1 + n2
  6. case '-':
  7. res = n1 - n2
  8. case '*':
  9. res = n1 * n2
  10. case '/':
  11. res = n1 / n2
  12. default:
  13. fmt.Println("不合法的运算符")
  14. }
  15. return res
  16. }
  17. func main() {
  18. fmt.Println("hello fn")
  19. var n1 float64 = 1.2
  20. var n2 float64 = 2.1
  21. var opt byte = '+'
  22. var result float64 = calc(n1, n2, opt)
  23. fmt.Printf("%T %v \n", result, result)
  24. }

函数的问题

一个文件里出现超级多的函数
utils.go 文件,专门用于定义函数,让其它文件来调用,工具函数的封装,
db.go 文件,专门定义对数据库操作的函数

main.go 文件,引入其它文件,使用工具函数, 代码更专注

引出包的概念,分门别类的使用
多人协同开发,相同的函数名可以存在不同的包下面

包的原理

包的本质,实际上就是创建不同的文件夹,来存放程序文件。

包的介绍

go的每一个文件都属于一个包的,也就是说go以包的形式来管理文件和项目目录结构的。
大写字母开头的标识符,表示该标识符可导出

作用:

  • 区分相同名字的函数、变量等标识符
  • 当程序文件很多时,很好的管理项目
  • 控制函数、变量的访问范围,即作用域

    语法

    1. package util

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

    包名.函数名
    1. import "包的路径"
    2. // GOPATH or GOROOT src, env.GO111MODULE
    ```go // 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 }

  1. ```go
  2. // main/main.go
  3. import (
  4. "fmt"
  5. "go_code/fndemo1/utils"
  6. )
  7. func main() {
  8. var n1 float64 = 1.233
  9. var n2 float64 = 2.111
  10. var opt byte = '+'
  11. var result float64 = utils.Calc(n1, n2, opt)
  12. fmt.Printf("%T %.2f= \n", result, result)
  13. }
  14. // %.2f 默认宽度,精度2
  15. // 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表示输出的目录,没有则会自动创建

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