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


目录
相关文章
|
5月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
265 61
|
1月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
129 4
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
152 1
|
2月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
4月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
300 63
|
3月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
295 0
|
5月前
|
人工智能 Dart Go
Go语言中的make和new函数的区别及使用场景
本文详细解析了Go语言中`make`和`new`函数的使用方法及区别。`make`用于创建切片、映射和通道等引用类型,返回初始化后的值;`new`用于创建任意类型的零值对象,返回指向该对象的指针。文章通过多个示例说明两者的应用场景,并总结了面试中可能遇到的相关问题,如底层实现、使用场景及优缺点等,帮助读者更好地理解和区分这两个函数。
179 1
|
6月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
125 5
|
6月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
280 15
|
6月前
|
Go Python
函数的定义与调用 -《Go语言实战指南》
本文介绍了 Go 语言中函数的核心特性与用法,包括基本定义格式、调用方式、多返回值、返回值命名、参数类型简写、可变参数、高阶函数及匿名函数等内容。通过示例代码详细展示了如何定义和使用不同类型的函数,使读者能够全面了解 Go 函数的灵活性与强大功能。
122 12
下一篇
oss云网关配置