# Go学习-Day3

news/2024/7/7 23:41:00

文章目录

    • 循环语句
    • 函数
      • 声明
      • init函数
      • 匿名函数
      • 闭包
      • defer

  • 个人博客:CSDN博客

循环语句

  • 传统方法

  • func main() {
    	for i := 1; i < 10; i++ {
    		fmt.Println("hello!")
    	}
    }
    
  • for - range方法

  • func main() {
    	str := "abcde"
    	for idx, val := range str {
    		fmt.Printf("%v %c\n", idx, val)
    	}
    }
    
  • idx是下标,val是值

  • go没有while和do-while使用for来实现

  • 	for {
    		if i > 10 {
    			break
    		}
    		fmt.Println(i)
    		i++
    	}
    

函数

声明

  • func 函数名(形参列表)返回值列表 {}

  • func add(a int, b int) int {
    	return a + b
    }
    
  • 分包写函数

  • package main
    
    import (
    	"fmt"
    	"go_code/project01/model"
    )
    
    func main() {
    	fmt.Println(model.Add(1, 2))
    }
    
    
  • 包名和文件夹名可以不一致,这样下面调用的时候也要用另外的包名,一般来说,我们习惯于名字保持一致,这样我们导入包的时候,就就能知道包名是什么了。

  • 再复习一个点,Go语言没有public private关键字,是用变量和函数第一个字母大小写来判断公有还是私有,大写是公有,小写是私有。

  • 导包的路径,是从GOPATH/src 后面的部分,一直导到包文件夹。

  • 在同一包下,不能又相同的函数名,不支持函数的重载

  • 如果要编译可执行文件必须声明main包,main包是唯一的。

init函数

  • 每个源文件都可以包含一个init函数,这个函数会在main函数之前被调用,全局变量定义,init函数,main函数的顺序调用
  • 可能相当于类当中的构造函数

匿名函数

  • 相当于把整个函数体当作函数的名字,后面的括号就是传入的参数列表

  • func main() {
    	res := func(a int, b int) int {
    		return a + b
    	}(1, 2)
    	fmt.Println(res)
    }
    
  • 如果不带括号,可以重复调用匿名函数,类似lamda表达式

  • 	res := func(a int, b int) int {
    		return a + b
    	}
    	//fmt.Println(res)
    	
    	fmt.Println(res(1, 2))
    

闭包

  • func main() {
    	f := func() func(int) int {
    		var n int = 10
    		return func(x int) int {
    			n = x + n
    			return n
    		}
    	}
    	ff := f()
    	ff(1)
    	ff(2)
    	fmt.Println(ff(3))
    }
    
  • 答案16

  • 这里是一个返回值是(int)int的匿名函数,返回了一个含有未知参数并且引用了n的匿名函数,对这个匿名函数多次调用。

  • 函数和引用的外部变量构成了闭包,相当于一个类,第一次调用得到一个匿名函数,可以类比成一个构造方法,构造出了一个类,n是类的一个成员。

  • 或者,我们这样想,这个匿名函数和他所引用的变量构成的闭包,在匿名函数第一次返回的时候,这些变量也在相同的作用域进行声明。

defer

  • to delay sth until a later time 推迟;延缓;展期(摘自牛津)

  • func main() {
    	defer fmt.Println("ok1")
    	defer fmt.Println("ok2")
    	
    	fmt.Println("ok3")
    	fmt.Println("ok4")
    	
    }
    
  • 输出顺序是:3->4->2->1

  • defer先不执行,等到函数快要释放的时候,defer执行顺序遵从栈的顺序,先进后出

  • 当语句压入栈的时候,相关引用的变量也会拷贝一份进入栈。


http://lihuaxi.xjx100.cn/news/1471996.html

相关文章

2023年计算机设计大赛国三 数据可视化 (源码可分享)

2023年暑假参加了全国大学生计算机设计大赛&#xff0c;并获得了国家三等奖&#xff08;国赛答辩出了点小插曲&#xff09;。在此分享和记录本次比赛的经验。 目录 一、作品简介二、作品效果图三、设计思路四、项目特色 一、作品简介 本项目实现对农产品近期发展、电商销售、灾…

Android学习之路(9) Intent

Intent 是一个消息传递对象&#xff0c;您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信&#xff0c;但其基本用例主要包括以下三个&#xff1a; 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…

基于Vue的3D饼图

先看效果&#xff1a; 再看代码&#xff1a; <template><div class"container"><div style"height: 100%;width: 100%;" id"bingtu3D"></div></div></template> <script> import "echarts-liqu…

基于Python科研论文绘制学习 - task2

Matplotlib 1、subplot&#xff08;&#xff09; matplotlib.pyplot模块提供了一个 subplot() 函数&#xff0c;它可以均等地划分画布&#xff0c;该函数的参数格式如下&#xff1a; plt.subplot(nrows, ncols, index) nrows 与 ncols 表示要划分几行几列的子区域&#xff0…

【学会动态规划】摆动序列(27)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:链的保存(序列化)与加载(反序列化)]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 本文介绍了如何将链保存&#xff08;序列化&#xff09;到磁盘和从磁盘加载&#xff08;反序列化&#xff09;。我们使用的序列化格式是json或yaml。目前&#xff0c;只有一些链支持这种类型的序列化。随着时间的推移&…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:SequentialChain和TransformationChain]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 SequentialChain 在调用语言模型之后&#xff0c;下一步是对语言模型进行一系列的调用。若可以将一个调用的输出作为另一个调用的输入时则特别有用。在本节中&#xff0c;我们将介绍如何使用顺序链来实现这一点。顺序…