Go Web编程实战(4)----函数(一)

简介: Go Web编程实战(4)----函数(一)

前言


本篇博文主要介绍Go语言的函数定义以及其使用方法。


声明与使用函数


在Go语言中,声明函数的格式如下:

func function_name([parameter list])[return_types]{
  //函数体
}


大家在使用编译器进行开发的时候,比如GoLand,就会发现,你输入func回车结构就自动会出现。这也是Go语言开发非常方便的地方。下面,作者来详细说明上面的参数:


func:函数声明关键字

function_name:函数名

parameter:参数列表,可选项,可以没有参数

return_types:返回值类型,也是可选项


下面,我们来举例说明使用,示例如下(输出3):

func main() {
  fmt.Println(XaddY(1, 2))
}
func XaddY(x, y int) int {
  return x + y
}


返回多个值

在Go语言函数中,如果需要返回多个值,并不需要通过列表或者数组返回,可以单独返回任意多个值。这也是Go语言非常方便的地方,示例如下:

func main() {
  fmt.Println(XaddYOrXmultiplyY(1, 2))
}
func XaddYOrXmultiplyY(x, y int) (int,int) {
  return x + y, x * y
}


这里,我们返回了2个参数,一个是加法值,一个是乘法值。


return可以为空

当Go语言函数有返回值的时候,其return可以为空,但并不是实际没有返回值,而是可以将返回值的顺序直接定义在函数定义中。


下面,我们将上面的返回多个值修改一下,示例如下:

func main() {
  fmt.Println(XaddYOrXmultiplyY(1, 2))
}
func XaddYOrXmultiplyY(x, y int) (a, b int) {
  a = x + y
  b = x * y
  return
}


这里,返回值的数据依旧与上面返回值一样,因为作者把返回值的返回顺序已经定义到返回参数中,所以return可以为空。


如果你自己写return语句,也可以修改顺序,比如return b,a。它就会先返回b,再返回a。也就是说,它可以根据定义顺序返回,也可以根据你的顺序返回,只要返回参数类型数量是对的,并不会报错。


函数参数

参数

在Go语言中,参数同样分为实参与形参。什么是实参与形参呢?


实参:在调用函数时,传给形参的实际的数据被称为实际参数。

形参:在调用函数时,用于接收外部传入的数据被称为形式参数。


值传递

值传递是指,在调用函数时将实际参数复制一份传递到函数中。这样在函数中进行修改,对传递的参数不会有任何影响。


比如,我们实现一个交换值的函数,看看效果:

func main() {
  var x,y int=5,9
  exchange(x,y)
  fmt.Println(x,y)
}
func exchange(x, y int){
  var temp int
  temp=x
  x=y
  y=temp
}


运行之后,你会发现控制台还是5,9,x与y的值没有任何的变化。这就是值传递的结构,不会改变原来的变量值。


引用传递

而引用传递,就会改变原来的变量。同样的,我们还是使用其实现数据的交换,示例如下:

func main() {
  var x, y int = 5, 9
  exchange(&x, &y)
  fmt.Println(x, y)
}
func exchange(x, y *int) {
  var temp int
  temp = *x
  *x = *y
  *y = temp
}


这个时候,你再运行,其控制台会输出9,5,因为是引用传递,所以改变了原来的参数值。


可选函数

顾名思义,就是可要可不要,可长可短的参数。定义可选函数的示例如下:

func main() {
  var x = []int{2, 3}
  fmt.Println(x)
}
func exchange(arg ...int) {
  var temp int
  temp = arg[0]
  arg[0] = arg[1]
  arg[1] = temp
}


注意,arg是一个int的切片,它可以直接通过for-range进行遍历。

相关文章
|
5天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
31 3
|
1天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
18 7
|
2天前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
|
2天前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些
|
5天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
195 0
|
5天前
|
监控 安全 Shell
记一次应急靶场实战--web1
本次应急靶机题目训练主要是为了应对接下来的护网面试和比赛,顺便提高一下自己对应急和溯源的实战能力,这里有两个逗比的事情发生,一是用D盾分析的时候,电脑环境监测到了,把要分析的马杀了,二是,发现无法使用脚本,在自己本机实验,电脑差点搞崩,还好佬在制作时候只是单次运行会占用.切记不要本机实验,一定要在虚拟机中进行测试.
|
5天前
|
JavaScript 前端开发 索引
【Web 前端】jQuery 里的 each() 是什么函数?你是如何使用它的?
【5月更文挑战第2天】【Web 前端】jQuery 里的 each() 是什么函数?你是如何使用它的?
|
5天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
5天前
|
前端开发 JavaScript
【Web 前端】$(document).ready() 是个什么函数?为什么要用它?
【5月更文挑战第2天】【Web 前端】$(document).ready() 是个什么函数?为什么要用它?