go语言 函数和包

go语言 函数和包

一、函数

在Go语言中,函数是执行特定任务的自包含代码块。

1.函数的定义

函数通过func关键字定义,格式如下:

func 函数名(形参 形参类型, 形参 形参类型) 返回值类型 {函数体return 返回值
}

2.基础函数类型

  • 无参数无返回值
  • 单个参数,无返回值
  • 多个相同类型参数,无返回值
  • 多个不同类型参数,无返回值
  • 多个参数,一个返回值
  • 多个参数,多个返回值
package mainimport "fmt"func main() {demo01()//demo02("d") // 类型不匹配demo02(2)demo03(1, 2)demo04(1, "A")var res = demo05(1, 2)fmt.Println("a+b:", res)var res1, res2 = demo06(1, 1)fmt.Println(res1, res2)
}// 无参数无返回值
func demo01() {fmt.Println("hello world")
}// 单个参数,无返回值
func demo02(a int) {fmt.Println("a:", a)
}// 多个相同类型参数,无返回值
func demo03(a, b int) {fmt.Println("a+b:", a+b)
}// 多个不同类型参数,无返回值
func demo04(a int, b string) {fmt.Println("a:", a)fmt.Println("b:", b)
}// 多个参数,一个返回值
func demo05(a, b int) int {return a + b
}// 多个参数,多个返回值
func demo06(a, b int) (int, bool) {if a+b > 3 {return a + b, true} else {return a * b, false}
}

3.特殊函数类型

  • 匿名函数test06展示了如何在Go中定义匿名函数,即没有函数名的函数。
  • 函数作为一等公民f变量可以存储函数,test11返回一个函数作为其结果。
  • 命名返回值test10展示了如何使用命名返回值,这有助于提高代码的可读性。
  • 闭包test12是一个闭包示例,它捕获并使用外部作用域的变量。
  • 函数作为参数test14接受一个函数作为参数,并在函数体内调用它。
  • 类型重命名MyFuncfunc(string) (int, int)类型的别名。
package mainimport "fmt"func main() {demo01()// 函数作为一等公民var demo02 = func(a, b int) int {return a + b}var res = demo02(15, 16)fmt.Println(res)var res1, res2 = demo03(16, 17)fmt.Println(res1, res2)// 闭包var ff = demo04(15)ff()// 函数作为参数var f1 = func(a int) {fmt.Println(a)}demo05(15, f1)// 类型重命名type StringProcessor func(string) stringprocessor := StringProcessor(func(input string) string {return "Processed: " + input})result := processor("Input")fmt.Println(result)}// 匿名函数
func demo01() {fmt.Println("demo01--start")// 定义匿名函数并立即执行func() {fmt.Println("demo01--inner")}()fmt.Println("demo01--end")
}// 命名返回值
func demo03(a, b int) (sum int, flag bool) {sum = a + bflag = true//return sum, flag   // 可以指定return // 也可以不在指定
}// 闭包
func demo04(x int) func() {x = 666f := func() {fmt.Println("我是内部函数", x)}return f
}// 函数作为参数
func demo05(a int, f func(i int)) {f(a)
}

4.装饰器函数

  • Go语言虽然没有像一些其他语言(例如Python)那样的装饰器语法,但是可以通过闭包来实现类似的功能。

  • 装饰器通常用于在不修改原始函数代码的情况下增加函数的功能。

  • 示例

package mainimport ("fmt""time"
)// 普通函数
func sayHello(name string) string {time.Sleep(time.Second) // 延迟1秒return "Hello " + name
}// 自定义装饰器,计时功能
func timeTrack(fn func(string) string) func(string) string {return func(name string) string {startTime := time.Now()              //  记录开始时间result := fn(name)                   //  调用原始函数elapsedTime := time.Since(startTime) //  计算经过时间fmt.Printf("耗时: %s \n", elapsedTime)return result}
}
func main() {// 使用装饰器增强原始函数enhanceSayHello := timeTrack(sayHello)helloMessage := enhanceSayHello("world")fmt.Println(helloMessage)
}

二、包

在Go语言中,包(package)是组织源代码的基本单位,它有助于代码的可重用性和可读性

1.包规则

  1. 导出规则:如果一个函数、变量或类型的名称以大写字母开头,它就是导出的(exported),这意味着它可以在包外部被访问和使用。如果以小写字母开头,则它在包外部是不可见的。
  2. 包名一致性:在同一个文件夹下的所有Go源文件应该属于同一个包,并且包名通常建议与文件夹名相同。这是为了保持代码的清晰和易于理解。
  3. 包内部可见性:在同一个包内的所有源文件共享相同的包级作用域,这意味着这些文件中的所有变量、函数和类型都像是在同一个文件中一样可见。
  4. 使用包:要使用其他包中的导出成员,需要导入对应的包,并通过包名来引用它们。
  5. 导入包:使用import关键字来导入包。导入时,通常使用包的全路径名,例如import "demo/common"
  6. 导入并重命名包:如果包名冲突或者为了方便引用,可以在导入时为包指定一个新的名称,例如import cv1 "demo/common/v1"
  7. 一次导入多个包:可以通过一对花括号来一次导入多个包,这样可以保持代码的整洁。

2.示例

  • 目录结构

    • demo/
      ├── common/
      │   ├── v1/          # v1 是 common 包的一个子目录,表示版本1
      │   │   └── demo01.go # demo01.go 是 common 包 v1 版本的实现文件
      │   ├── demo02.go    # demo02.go 是 common 包的一部分,不在任何子目录中
      │   └── demo01.go    # 这是 common 包的另一个实现文件,可能与 v1 版本不同
      └── main.go          # main.go 是 main 包的入口文件,通常包含 main 函数
      └── go.mod           # go.mod 是 Go 模块的配置文件,记录模块的依赖关系
      
  • 文件内容

    • // main.go
      package main// 导入标准库中的fmt包
      import "fmt"// 一次导入多个包
      import ("demo/common"cv1 "demo/common/v1" // // 导入包并重命名
      )func main() {// 使用fmt包的Println函数fmt.Println("Hello, world!")res1 := common.Add(1, 2)fmt.Println(res1)res2 := cv1.Mul(4, 5) // 使用重命名的包fmt.Println(res2)
      }
    • // common/demo01.gopackage common
      func Add(a, b int) int {return a + b
      }
      
    • // common/demo02.gopackage common
      func Addd(a, b int) int {return Add(a, b) + b
      }
      
    • // common/v1/demo01.gopackage v1
      func Mul(a, b int) int {return a * b
      }
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中数组出现__ob__: Observer属性,导致不能正确使用问题解决

直接上图,如下图,数组中出现__ob__: Observer属性,导致无法取值。 解决方案为:JSON.parse(JSON.stringify(数组变量名))深拷贝数组,重新生成一个可枚举数组。 // 处理代码如let tempIds JSON.parse(JSON.stringify(i…

一文带你初探FreeRTOS信号量

本文记录我初步学习FreeRTOS的信号量的知识,在此记录分享,希望我的分享对你有所帮助! 什么是信号量 在FreeRTOS中,信号量(Semaphore)是一种用于任务间同步和资源共享的机制。信号量主要用于管理对共享资源的…

Cgi上传文件 注意事项

//核心代码 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //错误方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 参考博客&#xff1a; https://blog.cs…

GNU/Linux - 各种包管理器介绍

Linux 包管理器根据不同的发行版和包管理系统有所不同。以下是一些常见的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在图片上添加文字

HTML如何在图片上添加文字 当我们开发一个页面&#xff0c;插入图片时&#xff0c;需要有一组文字对图片进行描述。那么HTML中如何在图片上添加文字呢&#xff1f;这篇文章告诉你。 先让我们来看下效果图&#xff1a; 句子“这是一张夜空图片”被放置在了图片的左下角。 那么…

Leetcode.342 4的幂

给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4x 示例 1&#xff1a; 输入&#xff1a;n 16 输出&#xff1a;true示…

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…

C#面:ASP.NET Core Filter如何⽀持依赖注⼊?

ASP.NET Core Filter可以通过依赖注入来支持。在ASP.NET Core中&#xff0c;依赖注入是一种将依赖对象提供给类的机制&#xff0c;它可以帮助我们解耦和测试代码。 要在ASP.NET Core Filter中使用依赖注入&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物联网教学09

ESP32CAM物联网教学09 摄像头配上显示屏 小智给摄像头配上了一块液晶显示屏,ESP32Cam变得更加酷炫了,应用也更加广泛了。 TFT彩色显示屏从第一课的CameraWebServer开始,我们一直都是利用浏览器来查看显示摄像头的视频流,都需要借助这个网页提供的服务。 可以让ESP32Cam开…

【案例干货】智能导览智慧景区系统小程序开发主要功能

智能景区/园区导览系统是一种利用云计算、物联网等新技术&#xff0c;通过互联网或移动互联网&#xff0c;借助便携的终端上网设备&#xff0c;为游客提供全方位、便捷化街区导航与信息服务的系统。 其主要功能可以归纳为以下几个方面&#xff1a; 1. 街区资讯展示 信息介绍&…

缠中说禅李彪08年“假死”具体原因探讨

在缠中说禅的信徒圈内&#xff0c;流传着创始人李彪于2008年逝世的说法&#xff0c;这一事件常被描绘成一种悲壮的牺牲&#xff0c;仿佛是为了其理念与信徒们的福祉鞠躬尽瘁。然而&#xff0c;这一“逝世”既未经公开证实&#xff0c;也与李彪生前构建的高大名声形成了某种讽刺…

短链接学习day2

用户敏感信息脱敏展示&#xff1a; RequestParam 和 PathVariable的区别 注解是用于从request中接收请求的&#xff0c;两个都可以接收参数&#xff0c;关键点不同的是RequestParam 是从request里面拿取值&#xff0c;而 PathVariable 是从一个URI模板里面来填充。 PathVari…

异步加载与动态加载

异步加载和动态加载在概念上有相似之处&#xff0c;但并不完全等同。 异步加载&#xff08;Asynchronous Loading&#xff09;通常指的是不阻塞后续代码执行或页面渲染的数据或资源加载方式。在Web开发中&#xff0c;异步加载常用于从服务器获取数据&#xff0c;而不需要用户等…

昇思25天学习打卡营第12天|ResNet50迁移学习

昇思25天学习打卡营第12天|ResNet50迁移学习 前言ResNet50迁移学习数据准备下载数据集 加载数据集数据集可视化 训练模型构建Resnet50网络固定特征进行训练训练和评估可视化模型预测 个人任务打卡&#xff08;读者请忽略&#xff09;个人理解与总结 前言 非常感谢华为昇思大模型…

vite简介

vite是新一代前端构建工具&#xff0c;vite具有优势如下&#xff1a; 轻量快速的热重载&#xff08;HMR&#xff09;&#xff0c;能实现快速的服务启动。对TypeScript、JSX、CSS等支持开箱即用。真正的按需编译&#xff0c;不再等待整个应用编译完成。webpack构建与vite构建对…

Java 遍历Map的方法

在Java中遍历Map可以采用以下几种常见方法&#xff1a; 1、使用 entrySet 遍历 这是最常见的遍历方式&#xff0c;同时访问键值对。 for (Map.Entry<K, V> entry : map.entrySet()) {K key entry.getKey();V value entry.getValue();// 处理键值对} 2、遍历 keySet 后…

【Java】CompletableFuture+Mockito单元测试不通过 Unnecessary stubbings detected

文章目录 问题描述问题分析解决Thread.sleepget()Mockito.lenient() 问题描述 有个接口使用CompletableFuture实现的异步调用&#xff0c;现在要用Mockito写单元测试 Testpublic void updateNumAsync() {Integer newNum 600;// updateRoleCountAsync用CompletableFuture异步调…

Jenkins 强制杀job

有时候有的jenkins job运行时间太长&#xff0c;在jenkins界面点击x按钮进行abort&#xff0c;会失败&#xff1a; 这时候点击&#xff1a; “Click here to forcibly terminate running steps” 会进一步kill 任务&#xff0c;但是也还是有杀不掉的可能性。 终极武器是jenkin…

vue3【提效】使用 VueUse 高效开发(工具库 @vueuse/core + 新增的组件库 @vueuse/components)

Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;提供了可重用的组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。 官网 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安装 VueUse npm i vueuse/core vueuse/components&#xff08;可选&a…

llm学习-4(llm和langchain)

langchain说明文档&#xff1a;langchain 0.2.6 — &#x1f99c;&#x1f517; langChain 0.2.6https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.chat_models 1&#xff1a;模型 &#xff08;1&#xff09;自定义模型导入&#x…