【Go】函数的使用

news/2024/7/24 4:58:49 标签: golan, 指针, 函数

目录

函数返回多个值

init函数和import

init函数

main函数

函数的参数

值传递

引用传递(指针


函数返回多个值

用法如下:

package main

import (
	"fmt"
	"strconv"
)

// 返回多个返回值,无参数名
func MultFunc1(a int, b int) (int, string) {
	a = a + 1
	b = b + 1
	//数字转字符串
	itoa := strconv.Itoa(b)
	return a, itoa

}

// 返回多个返回值,有参数名
func MultFunc2(a int, b int) (r1 int, r2 int) {
	//形参有默认值 是0
	fmt.Println("形参r1: ", r1, "r2: ", r2)
	r1 = a + 1
	r2 = b + 1
	return

}

func MultFunc3(a int, b int) (int, int) {
	a = a + 1
	b = b + 1
	return a, b

}

func main() {
	var a, b = MultFunc1(1, 2)
	fmt.Println("a=", a, "b=", b)
	var c, d = MultFunc2(3, 4)
	fmt.Println("c=", c, "d=", d)
	var e, f = MultFunc3(5, 6)
	fmt.Println("e=", e, "f=", f)
}

形参是有默认值的 0 ""(空串) false 

init函数和import

init函数

init函数可以在package main 中,可在其他package中,可在同一个package中出现多次

main函数

main 函数只能在package main中。

执行顺序

golang中有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能用于package main)。这两个函数在定义的时候不能有任何的返回值和参数

虽然package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说都是不方便的,所以建议用户在一个package中每个文件只写一个init函数

程序的初始化和执行都始于main包

如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。

当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。

等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:

测试例子

代码结构如下

Lib1.go

package lib1

import "fmt"

func init() {
	fmt.Print("我是lib1")
}

func Lib1Test() {
	fmt.Println("lib1Test")
}

Lib2.go

package lib2

import (
	"fmt"
)

func init() {
	fmt.Print("我是Lib2")
}
func Lib2Test() {
	fmt.Println("lib2Test")
}

main.go

注意:如果文中没有使用,就需要家一个_

package main

import (
	"fmt"
	"goProject/aaa/lib1"
	"goProject/aaa/lib2"
)

func init() {
	fmt.Print("我是Lib3.go")
}

func main() {
	lib1.Lib1Test()
	lib2.Lib2Test()

}

注意看打印的结果

输出的顺序与我们上面图给出的顺序是一致的

函数的参数

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

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

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

值传递

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

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

下面使用一个经典的案例:两数交换

package main

import "fmt"

// 值传递
func Swap1(a int, b int) {
	var temp = a
	a = b
	b = temp

}

// 引用传递
func Swap2(a *int, b *int) {
	var temp = *a
	*a = *b
	*b = temp

}

func main() {
	a := 1
	b := 2
	Swap1(a, b)
	fmt.Println("值传递 a=", a, "b=", b)
	Swap2(&a, &b)
	fmt.Println("引用传递 a=", a, "b=", b)
}

执行结果如下:

第一种值传递的方式交换失败,是因为副本拷贝

第一种是引用传递,他是传递地址,那么引出了指针

引用传递(指针

指针在C++中有用到。引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

详情,可以去看看C++,我也去看看!


http://www.niftyadmin.cn/n/5546884.html

相关文章

suricata7 rule格式

suricata 7.0.5 suricata rule由三部分组成, action, header, options action,决定当前规则匹配上后需要执行的动作header,定义当前规则的协议,IP地址,端口,方向options,定义了具体的规则 一、 action 合法的action值有&#x…

windows驱动开发基础-环境篇

前言 Windows上无论是用户模式下还是内核模式下,有关驱动的开发都有可能影响系统稳定性,所以我们首先要准备一个专用的测试环境,可以使用VM等虚拟机方便环境修复和还原 测试模式 开启测试模式:cmd 命令 bcdedit /set testsign…

Labview_Note_4

1.字符串显示控件设置自动在最下边位置 字符串属性节点中→文本→滚动条位置 滚动框在滚动条中的位置。 如需设置该位置,可连线用于表示滚动行数的数值至该属性。LabVIEW在滚动条的最后一行显示连线至该属性的数值。如需滚动至文本的最后一行,可连线行…

Docassemble interview 未授权任意文件读取漏洞复现(CVE-2024-27292)

0x01 产品简介 Docassemble是一款强大的开源工具,主要用于自动化生成和定制复杂文档,特别是在法律文档处理领域表现出色。由Jonathan Pyle个人开发者开发,是一个免费的开源专家系统,用于指导访谈和文档组装。Docassemble基于Python编写,充分利用了Python的灵活性和广泛的…

x86芯片定制,Ethercat芯片定制,IP服务,适用于运动控制,工业总线等软硬一体机

x86芯片定制,Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验,对接您的产品规格场景需求,快速交付样机,包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

深入理解基本数据结构:数组详解

引言 在计算机科学中,数据结构是存储、组织和管理数据的方式。数组作为最基础的数据结构之一,广泛应用于各种编程场景。在这篇博客中,我们将详细探讨数组的定义、特点、操作及其在不同编程语言中的实现。 什么是数组? 数组是一种…

在Spring Boot中实现RESTful API设计

在Spring Boot中实现RESTful API设计 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. RESTful API简介 1.1 什么是RESTful API? RESTful API是一种设计风格,基于HTTP协议…

Windows11配置WSL2支持代理上网

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装WSL2分发版二、配置步骤三、测试总结 前言 说起来本来这个功能我也不需要的,只是最近突然有个需求就顺便研究了下,WSL2默认的网…