Go | 函数(包)的使用

简介: 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()


目录
相关文章
|
8天前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
18 3
|
14天前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
12 3
|
2月前
|
Go
go函数
go函数
33 10
|
27天前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
2月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
45 3
|
2月前
|
编译器 Go C++
Go to Learn Go之函数
Go to Learn Go之函数
25 0
|
2月前
|
编译器 Go 索引
Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用
本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。
|
3月前
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
|
3月前
|
安全 编译器 Go
Go 1.21: 泛型函数的全面回顾
Go 1.21: 泛型函数的全面回顾
|
3月前
|
编译器 数据库连接 Go
Go Sync 包:并发的 6 个关键概念
Go Sync 包:并发的 6 个关键概念