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.rhkb.cn/news/370647.html

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

相关文章

跨越语言的界限:Vue I18n 国际化指南

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 国际化简介 vue-i18n 安装和配置 创建语言包 基本使用 切换语言 动态翻…

大数据Spark 面经

1: Spark 整体架构 Spark 是新一代的大数据处理引擎,支持批处理和流处理,也还支持各种机器学习和图计算,它就是一个Master-worker 架构,所以整个的架构就如下所示: 2: Spark 任务提交命令 一般我们使用shell 命令提…

深入理解TCP协议格式(WireShark分析)

传输控制协议(TCP)是互联网中最为关键的通信协议之一。了解TCP协议的细节不仅对于网络工程师至关重要,对于任何涉及网络通信的软件开发人员而言都是必备的知识。本文旨在深入探讨TCP协议,从协议的基本概述到其工作机制&#xff0c…

237 删除链表中的节点

题目 有一个单链表的 head,我们想删除它其中的一个节点 node。 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。 删除给定的节点。注意,删…

用户身份和文件权限

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、用户身份与能力 二、文件权限与归属 三、文件的特殊权限 四、文件的隐藏属性 五、文件访问控制列表 六、su命令和sudo服务 致谢 一、…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络(FCN) 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

调试支付分回调下载平台证书

之前的原生代码放到webman里面,死活跑不通 没办法,只能用esayWeChat6.7 (自行下载) 它里面配置要用到平台证书 平台证书又要用到 composer require wechatpay/wechatpay 但是请求接口之前,你先要用到一个临时的平台…

linux下高级IO模型

高级IO 1.高级IO模型基本概念1.1 阻塞IO1.2 非阻塞IO1.3 信号驱动IO1.4 IO多路转接1.5 异步IO 2. 模型代码实现2.1 非阻塞IO2.2 多路转接-selectselect函数介绍什么才叫就绪呢?demoselect特点 2.3 多路转接-pollpoll函数介绍poll优缺点demo 2.4 多路转接-epoll&…

【算法笔记自学】第 5 章 入门篇(3)——数学问题

5.1简单数学 #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){return a>b; } void to_array(int n,int num[]){for(int i0;i<4;i){num[i]n%10;n /10;} } int to_number(int num[]){int sum0;for(int i0;i<4;i){sumsu…

移动端UI风格营造舒适氛围

移动端UI风格营造舒适氛围

Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置项bean 我们采用xml配置文件的方式对bean进行声明和管理&#xff0c;每一个bean标签都代表着需要被创建的对象并通过property标签可以为该类注入其他依赖对象&#xff0c;通过这种方式Spring容器就可以成功知道我们需要创建那些bean实…

cs224n作业3 代码及运行结果

代码里要求用pytorch1.0.0版本&#xff0c;其实不用也可以的。 【删掉run.py里的assert(torch.version “1.0.0”)即可】 代码里面也有提示让你实现什么&#xff0c;弄懂代码什么意思基本就可以了&#xff0c;看多了感觉大框架都大差不差。多看多练慢慢来&#xff0c;加油&am…

Camunda 整合Springboot 实战篇

1.导入依赖 <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter</artifactId><version>7.18.0</version></dependency><dependency><groupId>org.camunda.b…

C语言图书馆管理系统(管理员版)

案例&#xff1a;图书馆管理系统&#xff08;管理员版&#xff09; 背景&#xff1a; 随着信息技术的发展和普及&#xff0c;传统的图书馆管理方式已经无法满足现代图书馆高效、便捷、智能化的管理需求。传统的手工登记、纸质档案管理不仅耗时耗力&#xff0c;而且容易出现错…

剖析DeFi交易产品之UniswapV3:交易路由合约

本文首发于公众号&#xff1a;Keegan小钢 SwapRouter 合约封装了面向用户的交易接口&#xff0c;但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数&#xff0c;UniswapV3 的 SwapRouter 核心就只有 4 个交易函数&#xff1a; exactInputSingle&#xff1a;指…

华为机试HJ34图片整理

华为机试HJ34图片整理 题目&#xff1a; 想法&#xff1a; 将输入的字符串中每个字符都转为ASCII码&#xff0c;再通过快速排序进行排序并输出 input_str input() input_list [int(ord(l)) for l in input_str]def partition(arr, low, high):i low - 1pivot arr[high]f…

matlab 有倾斜的椭圆函数图像绘制

matlab 有倾斜的椭圆函数图像绘制 有倾斜的椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 有倾斜的椭圆函数图像绘制 为了确定椭圆的长轴和短轴的…

【Python】MacBook M系列芯片Anaconda下载Pytorch,并开发一个简单的数字识别代码(附带踩坑记录)

文章目录 配置镜像源下载Pytorch验证使用Pytorch进行数字识别 配置镜像源 Anaconda下载完毕之后&#xff0c;有两种方式下载pytorch&#xff0c;一种是用页面可视化的方式去下载&#xff0c;另一种方式就是直接用命令行工具去下载。 但是由于默认的Anaconda走的是外网&#x…

9 redis,memcached,nginx网络组件

课程目标: 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用:io检测 是否就绪 io操作 1. int clientfd = accept(listenfd, &addr, &len); 检测 全连接队列…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术&#xff0c;允许组件之间进行松耦合通信。通过使用事件监听机制&#xff0c;应用程序的各个组件可以在其他组件不直接引用的情况下&#xff0c;相互发送和接受消息。 需求 在技术派中有这样一个需求&#xff0c;当发布文章或…