go语言基础操作--二

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

a := 10str := "mike"//匿名函数,没有函数名字 形成一个闭包,函数定义,还没有调用f1 := func() { //:=自动推到类型fmt.Println("a= ", a)fmt.Println("str = ", str)}f1()//给一个函数类型起别名 这个写法不推荐type FuncType func() //函数没有参数,内推返回值//声明变量var f2 FuncTypef2 = f1f2()//定义匿名函数,同时调用func() {fmt.Printf("a = %d, str = %s\n", a, str)}() //后面的()代表此匿名函数//带参数的匿名函数f3 := func(i, j int) {fmt.Printf("i = %d , j = %d\n", i, j)}f3(1, 2)//定义匿名函数,同时调用func(i, j int) {fmt.Printf("i = %d , j = %d\n", i, j)}(10, 20)//匿名函数,有参有返回值x, y := func(i, j int) (max, min int) {if i > j {max = imin = j} else {max = jmin = i}return}(10, 20)fmt.Printf("x = %d, y = %d\n", x, y)
//闭包捕获外部变量的特点a := 10str := "mike"func() {//闭包以引用方式a = 666str = "go"fmt.Printf("内部:a = %d, str = %s\n", a, str)}() //()外部直接调用fmt.Printf("外部:a = %d, str = %s\n", a, str) //外部同步//内部:a = 666, str = go//	外部:a = 666, str = go

它不关心这些捕获了的变量和常量是否已经超出作用域,所以只有闭包还在使用它,这些变量就还会存在

// 函数的返回值是一个匿名函数,返回一个函数类型
func testUnKoun() func() int {var x int //没有初始化,值为0return func() int {x++return x * x //函数调用完毕 x自动释放}
}
f := testUnKoun()
fmt.Println(f()) //1
fmt.Println(f()) //4
fmt.Println(f()) // 9
fmt.Println(f()) // 16

我们看到的声明周期不由它的作用域决定,变量x仍然隐式的存在于f中

函数调用定义

// 无参无返回值
func MyFunc() {a := 666fmt.Println("a= ", a)
}// 有参无返回值
// 参数传递,只能由实参传递给形参,不能反过来,单向传递
func MyFunc1(a int) { //定义函数,在()中定义的参数叫形参//a = 111fmt.Println("aa = ", a)
}func MyFunc2(a int, b int) { //定义函数,在()中定义的参数叫形参 简单写法func MyFunc2(a,b int)//a = 111fmt.Printf("a= %d, b = %d \n", a, b)
}func MyFunc3(a int, b string, c float64) {fmt.Printf("a=%d, b = %s,c = %f\n", a, b, c)
}// 不定参数类型 ...type 不定参数,只能放在形参中的最后一个参数
func MyFunc4(args ...int) { //传递的实参可以是0或者多个fmt.Println("len(args) = ", len(args)) //获取用户传递参数的个数for i := 0; i < len(args); i++ {fmt.Printf("args[%d] = %d\n", i, args[i])}
}
func main01() {MyFunc()MyFunc1(11) //实参MyFunc2(666, 777)MyFunc3(11, "aaa", 3.14)MyFunc4(1, 2, 3)
}
// 固定参数一定要传参,不定参数根据需求传参 不定参数类型 ...type 不定参数,只能放在形参中的最后一个参数
func MyFunc5(a int, args ...int) { //传递的实参可以是0或者多个}func myFunc01(tmp ...int) {for _, data := range tmp {fmt.Println("data = ", data)}
}
func myFunc02(tmp ...int) {for _, data := range tmp {fmt.Println("data = ", data)}
}// 不定参数的传递
func test(args ...int) {//全部元素传递给myFunc01myFunc01(args...)fmt.Println("================")//只想把后2个参数传递给另外一个函数使用myFunc02(args[:2]...) //0~2(不包括数字2),触底传递过去 1 2myFunc02(args[2:]...) //从args[2]开始(包括本身),把后面所有元素传递过去 3 4
}// 无参有返回值 只有一个返回值
// 有返回值的函数需要通过return中断函数,通过return返回
func myfunc01() int {return 666
}// 给返回值起一个变量名,go推荐写法 常用写法
func myfunc02() (result int) {//return 666result = 666return
}// 多个返回值
func myfunc03() (int, int, int) {return 1, 2, 3
}// go官方推荐写法
func myfunc04() (a int, b int, c int) {a, b, c = 111, 222, 333return
}// 有参有返回值
func MaxAndMin(a, b int) (max, min int) {if a > b {max = amin = b} else {max = bmin = a}return
}func funcb() (b int) {b = 222fmt.Println("funcb b = ", b)return
}// 普通函数的调用流程
func funca() (a int) {a = 111b := funcb()fmt.Println("funca b = ", b)//调用另外一个函数fmt.Println("funca a = ", a)return
}

main()

//MyFunc5(111, 1, 2, 3)//test(1, 2, 3, 4)//var a int//a = myfunc01()//fmt.Println("a = ", a)//b := myfunc01()//fmt.Println("b = ", b)////c := myfunc02()//fmt.Println("c = ", c)////a, b, c = myfunc03()//fmt.Println(a, b, c)////a, b, c = myfunc04()//fmt.Println(a, b, c)//max, min := MaxAndMin(10, 20)//fmt.Println(max, min)/**main funcfuncb b =  222funca b =  222funca a =  111main a =  111*///fmt.Println("main func")//a := funca()//fmt.Println("main a = ", a)

递归函数实现

// 函数递归调用的流程
func testRecursion(a int) { //函数调用终止调用的条件,非常重要if a == 1 {fmt.Println("a = ", a)return}//函数调用自身testRecursion(a - 1)fmt.Println("a = ", a)
}// 数字累加
func InteragerSum() (sum int) {for i := 0; i <= 100; i++ {sum += i}return
}func InteragerSum1(i int) int {if i == 1 {return 1}return i + InteragerSum1(i-1)}

main方法

//testRecursion(3)//var sum int
sum = InteragerSum()
//sum = InteragerSum1(100)
//fmt.Println("sum = ", sum)

回调函数

// 起别名
type funcType func(int, int) int// 实现加法
func Add(a, b int) int {return a + b
}func Minus(a, b int) int {return a - b
}func Mul(a, b int) int {return a * b
}// 回调函数,函数参数是函数类型,这个函数就是回调函数
// 计算器可以进行四则运算 多态,多种形态 调用同一个接口,不同的表现,可以实现不同表现,加减乘除
func Calc(a, b int, fTest funcType) (result int) {fmt.Println("Calc")result = fTest(a, b) // 这个函数还没有实现//result = Add(a,b) // Add必须定义后,才能调用return
}

main方法

//a := Calc(1, 1, Add)
//fmt.Println("a = ", a)
// 形成了一个独立的空间
func testClouse() int {//函数被调用时,x才分配空间,才初始化为0var x int //没有初始化值为0x++return x * x //函数调用完毕 x自动释放
}// 函数的返回值是一个匿名函数,返回一个函数类型
func testUnKoun() func() int {var x int //没有初始化,值为0return func() int {x++return x * x //函数调用完毕 x自动释放}
}

main方法

//返回值为一个匿名函数,返回一个函数类型,通过f来调用返回的匿名函数,f来调用闭包函数
f := testUnKoun()
fmt.Println(f()) //1
fmt.Println(f()) //4
fmt.Println(f()) // 9
fmt.Println(f()) // 16

defer调用

/**defer作用,关键字defer用户延迟一个函数或者方法(或者当前所创建的匿名函数)的执行。注意defer语句只能出现在函数或方法的内部。*///defer 延迟调用 main函数结束前调用defer fmt.Println("bbbbbbbbbb")fmt.Println("aaaaaaaaaa")//aaaaaaaaaa//bbbbbbbbbb

多个defer执行顺序

如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行,哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行。

/*
*
defer语句经常被用于处理成对的操作,如打开,关闭,连接,断开连接
加锁,释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,
资源被释放。释放资源的defer应该直接跟在请求资源的语句后。
*/func test(x int) {sum := 100 / xfmt.Println(sum)
}func main() {bbbbbbbbbbbaaaaaaaaaaa//defer fmt.Println("aaaaaaaaaaa")//defer fmt.Println("bbbbbbbbbbb")调用一个函数,导致内存出问题//test(0) //这个会先调用//defer fmt.Println("ccccccccccc")//ccccccccccc//bbbbbbbbbbb//aaaaaaaaaaadefer fmt.Println("aaaaaaaaaaa")defer fmt.Println("bbbbbbbbbbb")//调用一个函数,导致内存出问题defer test(0) //defer fmt.Println("ccccccccccc")
}

defer和匿名函数结合使用

package mainimport "fmt"func main01() {a := 10b := 20defer func() {fmt.Println(a, b)}()a = 111b = 222fmt.Println(a, b) /// 111 222
}func main() {a := 10b := 20defer func(a, b int) {fmt.Println(a, b)}(a, b) // 10 20 把参数传递过去 已经先传递参数,只是没有调用a = 111b = 222fmt.Println(a, b) /// 111 222
}

获取命令行参数

package mainimport ("fmt""os"
)// 获取命令行参数
func main() {//接收用户传递的参数,都是以字符串方式传递的list := os.Argsn := len(list)fmt.Println("n = ", n)for i := 0; i < n; i++ {fmt.Printf("list[%d] = %s\n", i, list[i])}for i, data := range list {fmt.Printf("list[%d] = %s\n", i, data)}
}

在这里插入图片描述

局部变量

package mainimport "fmt"func test() {a := 10fmt.Println("a = ", a)
}func main() {//定义在{}里面的变量就是局部变量,只能在{}里面有效// 执行执行到定义变量那句话,才开始分配空间,离开作用域自动释放//作用域,变量起作用的范围{i := 10fmt.Println("i = ", i)}
}

全局变量

package mainimport "fmt"func test() {fmt.Println("test = ", a)
}// 定义在函数外部的变量是全局变量 全部变量在任何地方都能使用
var a int// a := 10 没有这样的写法
func main() {//全局变量a = 10fmt.Println("a = ", a)test()
}

不同作用域的同名变量

package mainimport "fmt"var a byte //全局变量func main() {//不同作用域的同名变量//不同作用域,允许定义同名变量//使用变量的原则,就近原则var a int             //局部量fmt.Printf("%T\n", a) //int{var a float32fmt.Printf("2: %T\n", a) //float32}test()
}func test() {fmt.Printf("3: %T\n", a) //uint8
}

工作区介绍

导入包
import "fmt" //1
import . "fmt" //2
import io "fmt" //给包名起别名
import(
"fmt"
"os"
)
import _ "fmt" //忽略此包

工程管理

1 分文件编程(多个源文件),必须放在src目录
2 设置GOPATH环境变量

init函数

import _“fmt” _操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数

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

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

相关文章

04. 函数和函数调用机制

1. 先学习/复习C语言的入门知识 1.1 C语言简介 C语言是一种通用的编程语言&#xff0c;于1972年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;创建。C语言最初目的是为了开发UNIX操作系统&#xff0c;但由于其简洁的语法、快速的执行速度和可移植性&#xff0c;自此成…

【Python数据分析】数据分析之numpy基础

实验环境&#xff1a;建立在Python3的基础之上 numpy提供了一种数据类型&#xff0c;提供了数据分析的运算基础&#xff0c;安装方式 pip install numpy导入numpy到python项目 import numpy as np本文以案例的方式展示numpy的基本语法&#xff0c;没有介绍语法的细枝末节&am…

ZooKeeper基础命令和Java客户端操作

1、zkCli的常用命令操作 &#xff08;1&#xff09;Help &#xff08;2&#xff09;ls 使用 ls 命令来查看当前znode中所包含的内容 &#xff08;3&#xff09;ls2查看当前节点数据并能看到更新次数等数据 &#xff08;4&#xff09;stat查看节点状态 &#xff08;5&#xf…

【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署

蓝绿(Blue-Green)部署简介 在现代软件开发和交付中,确保应用程序的平稳更新和发布对于用户体验和业务连续性至关重要。蓝绿部署是一种备受推崇的部署策略,它允许开发团队在不影响用户的情况下,将新版本的应用程序引入生产环境。 蓝绿部署的核心思想在于维护两个独立的环…

ESP32C3 LuatOS RC522①写入数据并读取M1卡

LuatOS RC522官方示例 官方示例没有针对具体开发板&#xff0c;现以ESP32C3开发板为例。 选用的RC522模块 ESP32C3-CORE开发板 注意ESP32C3的 SPI引脚位置&#xff0c;SPI的id2 示例代码 -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "helloworld" VERSIO…

前端list列表自定义图标并设置大小

前端list列表自定义图标并设置大小 一、前端list列表基础知识回顾 前端公有两种列表&#xff0c;一种是有序列表&#xff08;ol&#xff09;&#xff0c;一种是无序列表&#xff08;ul&#xff09;&#xff0c;它们的子元素都是&#xff08;li&#xff09;。 1.1 有序列表&a…

4.0 Spring与Dubbo整合原理与源码分析

#Dubbo# 文章介绍 Dubbo中propertie文件解析以及处理原理Dubbo中@Service注解解析以及处理原理Dubbo中@Reference注解解析以及处理原理1.0 整体架构和流程 应用启动类与配置 public class Application {public static void main(String[] args) throws Exception {Annotation…

【【萌新的STM32学习-27--USART异步通信配置步骤】】

萌新的STM32学习-27–USART异步通信配置步骤 USART/UART 异步通信配置步骤 1.配置串口工作参数 HAL_UART_Init() 我们会在此处调用MSP中的回调函数 2.串口底层初始化 用户定义HAL_UART_MspInit() 配置GPIO NVIC CLOCK 等 3.开启串口异步接收中断 HAL_UART_Receive_IT() 4.…

CXL Memory Cache 分类及 Cacheline 归属问题

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

单调递增的数字【贪心算法】

单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 public class Solution {public int monotoneIncreasingDigits…

STM32+RTThread配置以太网无法ping通,无法获取动态ip的问题

记录一个非常蠢的问题&#xff0c;今天在移植rtthread的以太网驱动的时候出现无法获取动态ip的问题&#xff0c;问题如下&#xff1a; 设置为动态ip时不管是连接路由器还是电脑主机都无法ping通&#xff0c;也无法获取dns地址。 设置为静态ip时无法ping通主机。 使用wireshark…

【易售小程序项目】小程序首页完善(滑到底部数据翻页、回到顶端、基于回溯算法的两列数据高宽比平衡)【后端基于若依管理系统开发】

文章目录 说明细节一&#xff1a;首页滑动到底部&#xff0c;需要查询下一页的商品界面预览页面实现 细节二&#xff1a;当页面滑动到下方&#xff0c;出现一个回到顶端的悬浮按钮细节三&#xff1a;商品分列说明优化前后效果对比使用回溯算法实现ControllerService回溯算法 优…

stm32 iap sd卡升级

参考&#xff1a;STM32F4 IAP 跳转 APP问题_stm32程序跳转_古城码农的博客-CSDN博客 app程序改两个位置 1.程序首地址&#xff1a; 2.改中断向量表位移&#xff0c;偏移量和上面一样就可以 然后编译成bin文件就可以了

docker 笔记1

目录 1.为什么有docker ? 2.Docker 的核心概念 3.容器与虚拟机比较 3.1传统的虚拟化技术 3.2容器技术 3.3Docker容器的有什么作用&#xff1f; 3.4应用案例 4. docker 安装下载 4.1CentOS Docker 安装 4.2 Docker的基本组成 &#xff1f;&#xff08;面试&#xff09…

jmeter 性能测试工具的使用(Web性能测试)

1、下载 该软件不用安装&#xff0c;直接解压打开即可使用。 2、使用 这里就在win下进行&#xff0c;图形界面较为方便   在目录apache-jmeter-2.13\bin 下可以见到一个jmeter.bat文件&#xff0c;双击此文件&#xff0c;即看到JMeter控制面板。主界面如下&#xff1a; 3、创…

DEtection TRansformer (DETR) 与 You Only Look Once (YOLO)

曾经想过计算机如何分析图像&#xff0c;识别并定位其中的物体吗&#xff1f;这正是计算机视觉领域的目标检测所完成的任务。DEtection TRansformer&#xff08;DETR&#xff09;和You Only Look Once&#xff08;YOLO&#xff09;是目标检测的两种重要方法。YOLO已经赢得了作为…

【RISC-V】RISC-V寄存器

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图…

手撕二叉平衡树

今天给大家带来的是平衡树的代码实现&#xff0c;如下&#xff1a; #pragma once #include <iostream> #include <map> #include <set> #include <assert.h> #include <math.h> using namespace std; namespace cc {template<class K, clas…

CXL寄存器介绍(2)- CXL DVSEC

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…