六.函数的定义与调用

news2024/11/18 19:57:48

目录

一.内置函数:

二.标准库函数

三、自定义函数

1、函数定义

2、函数调用

3、函数参数

值传递:

引用传值:

4、函数返回多个值

5、defer语句

6、init函数:


一.内置函数:

Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。

它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用

于系统级的操作,

例如:panic。因此,它们需要直接获得编译器的支持。

在 Windows 下,标准库的位置在Go语言根目录下的子目录

pkg\windows_amd64 中;

在 Linux 下,标准库在Go语言根目录下go env ==》goroot 的子目录

pkg\linux_amd64 中

(如果是安装的是 32 位,则在 linux_386 目录中)。

二.标准库函数

一般情况下,标准包会存放在 $GOROOT/pkg/$GOOS_$GOARCH/ 目录下。

Go语言的标准库以包的方式提供支持,下表列出了Go语言标准库中常见的包及

其功能。

在线标准库: http://www.golang.ltd/

https://studygolang.com/pkgdoc

https://pkg.go.dev/std 官方帮助

三、自定义函数

函数是基本的代码块,用于执行一个任务。

Go 语言最少有1个 main() 函数。

你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称,返回类型和参数。

函数三要素:

1、名称 ==》功能

2、参数 ==》接口

3、返回值 ==》结果

函数分类:

1、内置函数 ==》不需要引用其他模块,直接使用 eg:len()

2、标准库函数 ==》引用第三方模块,或者其他模块,带名称使用

fmt.Println()

3、自定义函数 ==》程序员自行编写,自己调用。

1、函数定义

Go 语言函数定义格式如下:

func function_name ( [parameter list] ) [return_types] {

函数体

}

//parameter形参定义 return_types返回值的类型

eg

func add (a,b int) int {

return a + b

}

函数定义解析:

• func:函数由 func 开始声明

• function_name:函数名称,函数名和参数列表一起构成了函数签名。

注意:首字母大写表示公开函数,首字母小写是私有函数。

• parameter list]:参数列表,参数就像一个占位符,当函数被调用时,你

可以将值传递给参数,

这个值被称为实际参数。参数列表指定的是参数类型、顺序及参数个

数。参数是可选的,

也就是说函数也可以不包含参数。

• return_types:返回类型,函数返回一列值。return_types 是该列值的数

据类型。

有些功能不需要返回值,这种情况下 return_types 不是必须的。

• 函数体:函数定义的代码集合。

实例、以下实例为 max() 函数的代码,

该函数传入两个整型参数 num1 和 num2,并返回这两个参数的最大值:

/* 函数返回两个数的最大值 */ 
func max (num1, num2 int) int{ 
 /* 声明局部变量 */ 
 var result int 
 if (num1 > num2) { 
 result = num1 
 } else { 
 result = num2 
 } 
 return result 
} 

2、函数调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。

调用函数,向函数传递参数,并返回值,例如:

package main

import "fmt"

func main() {

/* 定义局部变量 */

var a int = 100

var b int = 200

var ret int

/* 调用函数并返回最大值 */

ret = max(a, b) // a ,b 实参

fmt.Printf( "最大值是 : %d\n", ret )

}

/* 函数返回两个数的最大值 */

// num1,num2是 形参

func max(num1, num2 int) int {

/* 定义局部变量 */

var result int

if (num1 > num2) {

result = num1

} else {

result = num2

}

return result

}

以上实例在 main() 函数中调用 max()函数,执行结果为:

最大值是 : 200

3、函数参数

函数如果使用参数,该变量可称为函数的形参。

形参就像定义在函数体内的局部变量。

调用函数,可以通过两种方式来传递参数:

值传递:

传递是指在调用函数时将实际参数复制一份传递到函数中,

这样在函数中如果对参数进行修改,将不会影响到实际参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际

参数。

接下来,让我们使用值传递来调用 swap() 函数:

package main 
import "fmt" 
func main() { 
 /* 定义局部变量 */ 
 var a int = 100 
 var b int = 200 
 fmt.Printf("交换前 a 的值为 : %d\n", a ) 
 fmt.Printf("交换前 b 的值为 : %d\n", b ) 
 
/* 通过调用函数来交换值 */ 
 swap(a, b) 
 fmt.Printf("交换后 a 的值 : %d\n", a ) 
 fmt.Printf("交换后 b 的值 : %d\n", b ) 
} 

/* 定义相互交换值的函数 */ 
func swap(x, y int) int { 
 var temp int 
 temp = x /* 保存 x 的值 */ 
 x = y /* 将 y 值赋给 x */ 
 y = temp /* 将 temp 值赋给 y*/ 
 return temp; 
} 

程序中使用的是值传递, 所以两个值并没有实现交互,我们可以使用 引用

传递 来实现交换效果。

引用传值:

引用传递是指在调用函数时将实际参数的地址传递到函数中,

那么在函数中对参数所进行的修改,将影响到实际参数。

引用传递指针参数传递到函数内,以下是交换函数 swap() 使用了引用传

递:

以下我们通过使用引用传递来调用 swap() 函数:

package main

import "fmt"

func main() {

/* 定义局部变量 */

var a int = 100

var b int= 200

fmt.Printf("交换前,a 的值 : %d\n", a )

fmt.Printf("交换前,b 的值 : %d\n", b )

/* 调用 swap() 函数

* &a 指向 a 指针,a 变量的地址

* &b 指向 b 指针,b 变量的地址

*/

swap(&a, &b)

fmt.Printf("交换后,a 的值 : %d\n", a )

fmt.Printf("交换后,b 的值 : %d\n", b )

}

func swap(x *int, y *int) {

var temp int

temp = *x /* 保存 x 地址上的值 */

*x = *y /* 将 y 值赋给 x */

*y = temp /* 将 temp 值赋给 y */

}

4、函数返回多个值

Go 函数可以返回多个值,例如:

package main

import "fmt"

func swap(x, y string) (string, string) {

return y, x

}

func main() {

a, b := swap("Mahesh", "Kumar")

fmt.Println(a, b)

}

以上实例执行结果为:

Kumar Mahesh

5、defer语句

Go语言中的defer语句会将其后面跟随的语句进行延迟处理

在defer所属的函数即将返回时,将延迟处理的语句按照defer定义的顺序逆序执行,即先进后出

package main 
import "fmt" 
func main() { 
fmt.Println("开始") 
defer fmt.Println(1) 
defer fmt.Println(2) 
defer fmt.Println(3) 
fmt.Println("结束") 
} 

以上代码执行结果如下

开始

结束

3

2

1

6、init函数:

每一个源文件都可以包含一个init函数,该函数会在main函数执行前,

被go框架调用,也就是说init()函数会在main()函数之前执行。

执行结果:

练习:

1、编写一个函数,完成两个数字的加法运算,并将结果返回。

2、编写函数完成 统计一段字符串,中文,英文字母,数字,空格,出现的次数:

3、编写 检测回文(中文) 函数

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

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

相关文章

实现java代码加密,jar\war加密

Springboot 项目代码加密,对你的代码进行加密,市面工具无法实现反编译。加密 Class 文件中每个方法的 Java 字节码,运行时在 JVM实现动态解密。 支持的部署环境Windows/Linux/macOS支持的框架SpringMVC、SpringBoot、Maven场景java加固&…

JAVA-编程基础-08-try-catch性能探究

Lsion <dreamlison163.com>, v1.0.0, 2023.04.01 JAVA-编程基础-08-try-catch性能探究 文章目录 JAVA-编程基础-08-try-catch性能探究try-catch会影响性能吗&#xff1f; try-catch会影响性能吗&#xff1f; 在 for 循环里面搞了个 try-catch&#xff0c;不知道try-cat…

Java的SPI

JavaSPI&#xff0c;全称是ServiceProviderInterface。 它是一种基于接口的动态扩展机制&#xff0c;相当于Java里面提供了一套接口。然后第三方可以实现这个接口来完成功能的扩展和实现。 举个简单的例子。 在Java的SDK里面&#xff0c;提供了一个数据库驱动的接口java.sql.Dr…

ModaHub魔搭社区:向量数据库Milvus性能优化问题(一)

目录 性能优化问题 为什么重启 Milvus 服务端之后&#xff0c;第一次搜索时间非常长&#xff1f; 为什么搜索的速度非常慢&#xff1f; 如何进行性能调优&#xff1f; 应如何设置 IVF 索引的 nlist 和 nprobe 参数&#xff1f; 性能优化问题 为什么重启 Milvus 服务端之后…

如何创建你的第一个西门子200PLC程序

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 创建西门子200PLC程序分五步&#xff1a;1.打开Micro/WIN软件&#xff1b;2.新建工程&#xff1b;3.打开程序编辑器&#xff1b;4.输入程序指令&#xff1b;5.保存程序。 我们以下图程序为例讲解西…

Unable to reload Maven project

原因就是IDEA的版本与Maven的版本冲突。 IDEA的日志报错如下&#xff1a; 我当时IDEA是2020版&#xff0c;Maven是3.8.5. 后来把Maven换成3.6.3版本就可以了。

途乐证券|沪深两市震荡整理 机器人概念成市场新热点

周四&#xff0c;A股三大指数维持窄幅震荡整理走势&#xff0c;沪深两市成交额仍维持在9000亿元下方&#xff0c;北向资金净卖出超70亿元。盘面上&#xff0c;减速器、机器人概念持续爆发&#xff0c;煤炭、电力板块领跌。 香港途乐证券有限公司&#xff08;191883.com&#xf…

【每日一题】Leetcode - 剑指 Offer 43. 1~n 整数中 1 出现的次数

题目 Leetcode - 剑指 Offer 43. 1&#xff5e;n 整数中 1 出现的次数 解题思路 分解数字中的每一位&#xff0c;判断记录 结果 class Solution {public int countDigitOne(int n) {int count 0;for (int i 1; i < n; i) {int localI i;while (localI / 10 ! 0) {in…

Leetcode-每日一题【143.重排链表】

题目 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; 请将其重新排列后变为&#xff1a; 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[1,5,2,…

Ubuntu 23.10 现在由Linux内核6.3提供支持

对于那些希望在Ubuntu上尝试最新的Linux 6.3内核系列的人来说&#xff0c;今天有一个好消息&#xff0c;因为即将发布的Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;已经重新基于Linux内核6.3。 Ubuntu 23.10的开发工作于4月底开始&#xff0c;基于目前的临时版本Ubu…

光模块封装类型有哪些?光模块“皮肤”大揭秘

什么是光模块&#xff1f; 光模块&#xff08;Optical Transceiver&#xff09;全称为光收发一体模块&#xff0c;它是光通信中的核心器件&#xff0c;能够完成信号的光-电/电-光转换过程&#xff0c;它由光电子器件、功能电路和光接口等部件组成&#xff0c;其中的光电子器件…

【STL】iterator adapters_反向迭代器的实现

放在专栏【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持 本章相关文章&#xff1a; 【STL】容器适配器 【STL】list的模拟实现 【STL】vector的模拟实现 1、反向迭代器介绍 1.1、前言 在前文中我们已经讲过STL中的适配器概念&#xff0c;即在底层将一个类的接口转…

centos7卸载自带jdk(openjdk)

前提&#xff1a;root模式 1、查看自带jdk 首先确定我们有自带的jdk&#xff0c;然后搜索jdk java -version rpm -qa | grep jdk 2、使用如下命令卸载openjdk rpm -e --nodeps [name] 复制带有openjdk的那两行&#xff0c;有的人可能有多行。一条条执行。 最后java -ver…

win10/11环境解决fastboot模式看不到设备

问题描述&#xff1a; C:\Users\good>adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached ? device C:\Users\good>fastboot devices fastboot devices 不是内部或外部命令&#xff0…

茶油生产加工MES质量溯源平台源码(spring boot+mybatis+easyui+mysql+h5)

一、生产加工MES&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;是一种面向车间的生产过程管理与实时信息系统。它主要负责监控生产过程&#xff0c;管理生产资源&#xff0c;优化生产流程&#xff0c;提高生产效率和质量。MES系统需要与ERP系统、…

【阻塞队列】阻塞队列DelayedWorkQueue源码详解

目录 一、前言 二、ScheduledThreadPoolExecutor线程池 三、DelayedWorkQueue延迟阻塞队列 四、工作原理 五、源码分析 5.1 定义 5.2 成员属性 5.3 构造函数 5.4 入队方法 5.4.1 offer添加元素 5.4.2 扩容grow() 5.4.3 向上堆化siftUp 5.5 出队方法 5.5.1 take()…

LangChain 基于 ChatGPT 构建本地知识库问答应用

一、使用本地知识库构建问答应用 上篇文章基于 LangChain 的Prompts 提示管理构建特定领域模型&#xff0c;如果看过应该可以感觉出来 ChatGPT 还是非常强大的&#xff0c;但是对于一些特有领域的内容让 GPT 回答的话还是有些吃力的&#xff0c;比如让 ChatGPT 介绍下什么是 L…

二重积分的解题技巧

计算方法 本节内容一般都应该先画图再思考后续内容较为直观 基本口诀是&#xff1a;后积先定限&#xff0c;限内画条线&#xff0c;先交写下限&#xff0c;后交写上限&#xff08;且下限必须小于上限&#xff09; 结合下图进行解释&#xff0c;后积先定限&#xff0c;对于X-型来…

Java基础-多线程JUC-多线程实现的三种形式

1. 第一种 继承Thread&#xff0c;重写run方法 public class demo1 {public static void main(String[] args) {/*** 多线程的第一种启动方式* 1. 定义一个类继承Thread* 2. 重写run方法* 3. 创建子类的对象&#xff0c;并启动线程*/MyThread myThread new MyThread();MyThrea…

受检异常和非受检异常

所谓的受检异常&#xff0c;表示在编译的时候强制检查的异常&#xff0c;这种异常需要显示的通过 try/catch 来捕捉&#xff0c;或者通过 throws 抛出去&#xff0c;否则从程序无法通过编译。 而非受检异常&#xff0c;表示在编译器可以不需要强制检查的异常&#xff0c;这种异…