狂神说Go语言学习笔记(四)

news2024/11/26 2:24:33

狂神说Go语言学习笔记(一)
狂神说Go语言学习笔记(二)
狂神说Go语言学习笔记(三)

一、什么是函数

func main() {
	//调用函数 函数名()
	fmt.Println(add(1, 2)) //3
}

func add(a, b int) int {
	c := a + b
	return c
}



二、函数的声明

func main() {
	printinfo()

	myprint("haha")

	fmt.Println(add2(1, 2))

	swap(1, 2)
	
}

// 无参返回值函数
func printinfo() {
	fmt.Println("printinfo")
}

// 有一个参数的函数
func myprint(msg string) {
	fmt.Println(msg)
}

// 有两个参数的函数
// 有一个返回值的函数
func add2(a, b int) int {
	c := a + b
	return c
}

// 有多个返回值的函数
func swap(a, b int) (int, int) {
	return b, a
}



三、形式参数和实际参数

// max 两个数字比大小
// 形式参数:定义函数时,用来接收外部传入数据的参数,就是形式参数
// 实际参数:调用函数时,传给形参的实际数据叫做实际参数
func max(num1, num2 int) int {
	var result int
	if num1 > num2 {
		result = num1
	} else {
		result = num2
	}

	//一个函数定义上有返回值,那么函数中必须使用return语句
	//返回值
	//调用处需要使用变量接受该结果
	return result
}



四、可变参数

概念:一个函数的参数类型确定,但是个数不确定,就可以使用可变参数

func myfunc(arg ... int){}

//arg ... int 告诉go这个函数接收不定数量的参数,类型全部都是int
func main() {
	getSum(1, 2, 3, 4, 5, 6, 7, 100)
}

func getSum(nums ...int) {
	sum := 0

	for i := 0; i < len(nums); i++ {
		fmt.Println(nums[i])
		sum += nums[i]
	}
	fmt.Println("sum:", sum)

}

在这里插入图片描述


五、值传递和引用传递

在这里插入图片描述

值传递

func main() {

	//定义一个数组
	arr1 := [4]int{1, 2, 3, 4}
	fmt.Println("arr1默认数据", arr1)
	update(arr1)
	fmt.Print("arr1调用函数后数据", arr1)
	//arr2的数据是从arr1复制来的,所以是不同的空间
	//修改arr2并不会影响arr1
	//值传递:传递的是数据的副本,修改数据,对于原始的数据没有影响
	//值类型的数据,默认都是值传递,基础类型 array struct
}

func update(arr2 [4]int) {
	fmt.Println("arr2接收数据", arr2)
	arr2[0] = 10
	fmt.Println("arr2修改后数据", arr2)
}

在这里插入图片描述
在内存中:
在这里插入图片描述
值传递类型的改变的都是原先数据的副本,两份分别在不同的内存空间中!,所以修改 arr1 , arr2 不会改变!

引用传递

// 引用传递
func main() {

	//切片,可以扩容的数组
	s1 := []int{1, 2, 3, 4}
	fmt.Println("s1默认数据", s1)
	update2(s1)
	fmt.Print("s1调用函数后数据", s1)
}

func update2(s2 []int) {
	fmt.Println("s2接收数据", s2)
	s2[0] = 10
	fmt.Println("s2修改后数据", s2)

}

在这里插入图片描述
在内存中:
在这里插入图片描述
s1 和 s2两个引用 都对同一片内存空间进行操作,改变s1 ,s2 当然也会变!


六、函数变量的作用域

在这里插入图片描述

//全局变量
var num int = 100
func main() {
	
	//函数体内的局部变量
	temp := 100
	if b := 1 ; b<=10{
		temp := 50
		fmt.Println(temp)//局部变量,就近原则
		fmt.Println(b)
	}
	fmt.Println(temp)
	fmt.Println(num)
}

func f1()  {
	a := 1
	fmt.Println(a)
	fmt.Println(num)
}

func f2()  {
	b := 2
	fmt.Println(b)
	fmt.Println(num)
}



七、递归函数

在这里插入图片描述

func main() {
	fmt.Println(getSum1(5)) //15
}

func getSum1(n int) int {

	if n == 1 {
		return 1
	}
	return getSum1(n-1) + n
}



八、defer

在这里插入图片描述

func main() {
	f("1")
	fmt.Println("2")
	defer f("3")
	fmt.Println("4")    //1 2 4 3
}

func f(s string) {
	fmt.Println(s)
}

在这里插入图片描述

func main() {
	f("1")
	fmt.Println("2")
	defer f("3")
	fmt.Println("4")
	defer f("5")
	fmt.Println("6")
	defer f("7")
	fmt.Println("8")   //1 2 4 6 8 7 5 3
}

func f(s string) {
	fmt.Println(s)
}
func main() {
	a := 10
	fmt.Println("a=", a)
	//参数已经传递过去了 在最后执行
	defer f(a)
	a++
	fmt.Println("end a=", a)
}

func f(s int) {
	fmt.Println("函数里面的a=", s)
}



九、函数的本质

// func() 本身就是一个数据类型
func main() {

	//f3 如果不加括号 函数就是个变量
	//f3() 如果加了括号那就成了函数的调用
	fmt.Printf("%T\n", f3) //func(int, int)

	//定义函数类型的变量
	var f5 func(int, int)
	f5 = f3   //引用类型的
	f5(1, 2)
}

func f3(a, b int) {
	fmt.Println(a, b)
}

在这里插入图片描述



十、匿名函数

// 匿名函数
func main() {
	h1()
	h2 := h1 //函数本身也是一个变量
	h2()

	//匿名函数
	h3 := func() {
		fmt.Println("我是h3函数")
	}
	h3()

	x1 := func(a, b int) int {
		fmt.Println(a, b)
		return a + b
		//fmt.Println("我是h4函数")
	}(1, 2)

	fmt.Println(x1)
}

func h1() {
	fmt.Println("我是h1函数")
}

在这里插入图片描述


十一、函数式编程

在这里插入图片描述

func main() {

	r2 := oper(1, 2, add)
	fmt.Println(r2) // 3
	r3 := oper(1, 2, sub)
	fmt.Println(r3) // -1
	r4 := oper(8, 4, func(i int, i2 int) int {
		if (i == 0) {
			fmt.Println("除数不能为0")
			return 0
		}
		return i / i2
	})
	fmt.Println(r4)  // 2
}
//高阶函数,可以接受一个函数作为一个参数
func oper(a, b int, fun func(int, int) int) int {
	r := fun(a, b)
	return r
}
func add(a, b int) int {
	return a + b
}

func sub(a, b int) int {
	return a - b
}



十二、闭包

/*
一个外层函数中,有内层函数,该内层函数中,会操作外层函数的局部变量
并且该外层函数的返回值就是这个内层函数
这个内层函数和外层函数的局部变量,统称为闭包结构

局部变量的生命周期就会发生改变 正常的局部变量会随着函数的调用而创建
随着函数的结束而销毁 但是闭包结构中的外层函数的局部变量并不会随着外层函数的结束而销毁 因为内层函数还在使用
*/

func main() {
	r1 := increment()
	fmt.Println(r1)  // 0x22e680

	v1 := r1()
	fmt.Println(v1) // 1

	v2 := r1()
	fmt.Println(v2) // 2

	r2 := increment()
	v3 := r2()
	fmt.Println(v3) // 1
}

func increment() func() int {
	//局部变量i
	i := 0
	//定义一个匿名函数,给变量自增并返回
	fun := func() int {
		i++
		return i
	}
	return fun
}

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

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

相关文章

[附源码]JAVA毕业设计高校在线办公系统(系统+LW)

[附源码]JAVA毕业设计高校在线办公系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

【配电网重构】基于粒子群算法的配电网重构问题研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Nacos config 配置相关

Nacos config 相关关于配置文件bootstrap和application异同点加载顺序优先级注意事项关于.properties和.yml比较加载顺序优先级别区别关于Nacos配置官方文档注意关于配置文件bootstrap和application SpringCloud项目中存在bootstrap和application两种配置&#xff0c;下面分别…

[附源码]计算机毕业设计springboot社区住户信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【正版软件】Navicat Monitor 实时数据库监控工具,一套安全、简单而且无代理的远程服务器监控工具。

简言 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 SQL Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure、阿里云、腾讯云和华为云等…

[附源码]Python计算机毕业设计Django高校商铺管理系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java+JSP+MySQL基于SSM的雷锋车队管理系统的设计与实现-计算机毕业设计

项目介绍 随着我国国民经济的发展和人文素质的不断提高&#xff0c;越来越多的爱心人士出现在了社会的各种角落之中&#xff0c;其中的哥和爱心人士&#xff0c;组织了一种基于交通和车辆之间的互助的民间组织&#xff0c;这种组织叫做雷锋爱心车队&#xff0c;而且雷锋爱心车…

【lambda表达式】变量作用域和lambda 表达式的处理

变量作用域 通常&#xff0c; 你可能希望能够在 lambda 表达式中访问外围方法或类中的变量。 public static void repeatMessage(String text, int delay){ActionListener listener event ->{ System.out.println(text);Toolkit.getDefaultToolkitO.beep();}new Timer(de…

PowerShell 打开十六进制文件

1&#xff0c;打开PowerShell 2&#xff0c;进入文件所在路径 3&#xff0c;Format-Hex -Path ./bootloader.bin 4&#xff0c;效果

selenium UI使用小技巧集合

selenium这个工具就不用我多介绍了吧&#xff0c;咱们已经说过很多很多次咯&#xff0c;所以就直接上主题&#xff1a; 窗口截图 webdriver 提供了 get_screenshot_as_file()函数来截取当前窗口 from selenium import webdriver from time import sleepdriver webdriver.Ch…

超详细的Python实现MySQL数据库基本操作,今天小编给大家整理好了

一、SQL语句 (mysql 数据库中的语言) show databases;查看数据库 use "database_ name" ;进入数据库 show tables; 查看当前数据库中有哪些表 select * from "table_ name";查询数据表中的所有内容 describe "table_ name"; 查看表结构 desc &q…

外包干了2年,彻底废了...

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

【Linux】Linux下基本指令(一)

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Linux》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 一、浅谈操作系统&#xff1a; 1.1什么是操作系统&#xff1f;&#xff…

力扣46:全排列(Java回溯)

一、题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&…

[附源码]计算机毕业设计springboot汽配管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python 如何根据索引快速删除列表中的多个元素

一、批量删除列表中不同位置的元素 列表是python中经常用到的一种数据结构&#xff0c;因python提供了很多方法对其增、删、查、改&#xff0c;故使用起来比较灵活&#xff0c;下面就介绍下如何快速删除列表中多个元素的方法。 二、具体用法 例如&#xff1a;待处理列表为[‘…

实体-联系模型--E-R图

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 数据库干货铺 ⭐E-R图⭐ 文章目录⭐E-R图⭐一&#xff0c;E-R模型的基本概念&#x1f468;‍&#x1f4bb;概…

setCharacterEncoding和setContentType有什么不同

如果仅仅从服务器的角度来看&#xff0c;这两个方法其实本质是一样的&#xff0c;以下内容是摘抄自oracle的官网&#xff1a; Defines an object to assist a servlet in sending a response to the client. The servlet container creates a ServletResponse object and passe…

HITCTF2022-WEB2-easypop

WEB easypop 题目给了源码 <?php // php version 7.4.32 class a{protected $a1;private $a2;private $a3;public function __unset($unset) {$this->a2 [];if($this->a3){if($this->a1->{$unset} ! []){$this->a1->{$unset} $this->a2;}}}funct…

Python编程 顺序执行与程序的主入口

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.顺序执行 1.顺序执行(了解) 2.程序主入口(熟悉) 前言 本章将会讲解P…