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()


目录
相关文章
|
3月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
161 61
|
2月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
203 63
|
1月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
117 0
|
4月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
66 5
|
4月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
195 15
|
4月前
|
Go Python
函数的定义与调用 -《Go语言实战指南》
本文介绍了 Go 语言中函数的核心特性与用法,包括基本定义格式、调用方式、多返回值、返回值命名、参数类型简写、可变参数、高阶函数及匿名函数等内容。通过示例代码详细展示了如何定义和使用不同类型的函数,使读者能够全面了解 Go 函数的灵活性与强大功能。
|
8月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
290 11
|
9月前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
302 8
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
10月前
|
Go 索引
go语言使用strings包
go语言使用strings包
195 3
|
10月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
142 3