go语言基础操作--二

news2025/4/11 3:12:39

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

a := 10
	str := "mike"

	//匿名函数,没有函数名字 形成一个闭包,函数定义,还没有调用
	f1 := func() { //:=自动推到类型
		fmt.Println("a= ", a)
		fmt.Println("str = ", str)
	}
	f1()

	//给一个函数类型起别名 这个写法不推荐
	type FuncType func() //函数没有参数,内推返回值
	//声明变量
	var f2 FuncType
	f2 = f1
	f2()

	//定义匿名函数,同时调用
	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 = i
			min = j
		} else {
			max = j
			min = i
		}
		return
	}(10, 20)
	fmt.Printf("x = %d, y = %d\n", x, y)
//闭包捕获外部变量的特点
	a := 10
	str := "mike"
	func() {
		//闭包以引用方式
		a = 666
		str = "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 //没有初始化,值为0

	return 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 := 666
	fmt.Println("a= ", a)
}

// 有参无返回值
// 参数传递,只能由实参传递给形参,不能反过来,单向传递
func MyFunc1(a int) { //定义函数,在()中定义的参数叫形参
	//a = 111
	fmt.Println("aa = ", a)
}

func MyFunc2(a int, b int) { //定义函数,在()中定义的参数叫形参 简单写法func MyFunc2(a,b int)
	//a = 111
	fmt.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) {
	//全部元素传递给myFunc01
	myFunc01(args...)
	fmt.Println("================")
	//只想把后2个参数传递给另外一个函数使用
	myFunc02(args[:2]...) //0~2(不包括数字2),触底传递过去 1 2
	myFunc02(args[2:]...) //从args[2]开始(包括本身),把后面所有元素传递过去 3 4
}

// 无参有返回值 只有一个返回值
// 有返回值的函数需要通过return中断函数,通过return返回
func myfunc01() int {
	return 666
}

// 给返回值起一个变量名,go推荐写法 常用写法
func myfunc02() (result int) {
	//return 666
	result = 666
	return
}

// 多个返回值
func myfunc03() (int, int, int) {
	return 1, 2, 3
}

// go官方推荐写法
func myfunc04() (a int, b int, c int) {
	a, b, c = 111, 222, 333
	return
}

// 有参有返回值
func MaxAndMin(a, b int) (max, min int) {
	if a > b {
		max = a
		min = b
	} else {
		max = b
		min = a
	}
	return
}

func funcb() (b int) {
	b = 222
	fmt.Println("funcb b = ", b)
	return
}

// 普通函数的调用流程
func funca() (a int) {
	a = 111

	b := 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 func
	funcb b =  222
	funca b =  222
	funca a =  111
	main 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才分配空间,才初始化为0
	var x int //没有初始化值为0
	x++
	return x * x //函数调用完毕 x自动释放
}

// 函数的返回值是一个匿名函数,返回一个函数类型
func testUnKoun() func() int {
	var x int //没有初始化,值为0

	return 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 / x
	fmt.Println(sum)
}

func main() {
	bbbbbbbbbbb
	aaaaaaaaaaa
	//defer fmt.Println("aaaaaaaaaaa")
	//defer fmt.Println("bbbbbbbbbbb")
	调用一个函数,导致内存出问题
	//test(0) //这个会先调用
	//defer fmt.Println("ccccccccccc")


	//ccccccccccc
	//bbbbbbbbbbb
	//aaaaaaaaaaa
	defer fmt.Println("aaaaaaaaaaa")
	defer fmt.Println("bbbbbbbbbbb")
	//调用一个函数,导致内存出问题
	defer test(0) //
	defer fmt.Println("ccccccccccc")
}

defer和匿名函数结合使用

package main

import "fmt"

func main01() {
	a := 10
	b := 20

	defer func() {
		fmt.Println(a, b)
	}()

	a = 111
	b = 222
	fmt.Println(a, b) /// 111 222
}

func main() {
	a := 10
	b := 20

	defer func(a, b int) {
		fmt.Println(a, b)
	}(a, b) // 10 20 把参数传递过去 已经先传递参数,只是没有调用

	a = 111
	b = 222
	fmt.Println(a, b) /// 111 222
}

获取命令行参数

package main

import (
	"fmt"
	"os"
)

// 获取命令行参数
func main() {

	//接收用户传递的参数,都是以字符串方式传递的
	list := os.Args
	n := 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 main

import "fmt"

func test() {
	a := 10
	fmt.Println("a = ", a)
}

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

全局变量

package main

import "fmt"

func test() {
	fmt.Println("test = ", a)
}

// 定义在函数外部的变量是全局变量 全部变量在任何地方都能使用
var a int

// a := 10 没有这样的写法
func main() {
	//全局变量
	a = 10
	fmt.Println("a = ", a)
	test()
}

不同作用域的同名变量

package main

import "fmt"

var a byte //全局变量

func main() {
	//不同作用域的同名变量
	//不同作用域,允许定义同名变量
	//使用变量的原则,就近原则
	var a int             //局部量
	fmt.Printf("%T\n", a) //int

	{
		var a float32
		fmt.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.coloradmin.cn/o/966752.html

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

相关文章

存储成本降低85%,携程历史库场景的降本实践

携程&#xff0c;一家中国领先的在线票务服务公司&#xff0c;从 1999 年创立至今&#xff0c;数据库系统历经三次替换。在移动互联网时代&#xff0c;面对云计算卷积而来的海量数据&#xff0c;携程通过新的数据库方案实现存储成本降低 85% 左右&#xff0c;性能提升数倍。本文…

TensorRT来加速YOLO v5推理与检测

TensorRT来加速YOLO v5推理与检测 文章目录 TensorRT来加速YOLO v5推理与检测TensorRT简介一、TensorRT安装1. 电脑基础环境2. 查看 cuda 版本3. 安装TensorRT4. 验证TensorRT 二、YOLO v5模型导出函数1.onnx 模型导出&#xff08;def export_onnx&#xff08;&#xff09;函数…

nmon性能监控工具介绍【杭州多测师_王sir】

nmon监控工具 (nmon监控centos6X)1) 工具准备nmon16X(性能监控)和nmon_analyser(性能报告分析器)&#xff1b;2) 下载nmon页面地址:http://nmon.sourceforge.net/pmwiki.php?nSite.Download3) 下载指定版本nmon到centos6X:wget https://nchc.dl.sourceforge.net/project/nmon…

HTTP协议初识·中篇

加上目录&#xff0c;会出现导向不正确的情况&#xff0c;可能是bug&#xff0c;目录一长就容易出错&#xff1f; 本篇主要讲解了&#xff1a; 网页分离(网页代码和.c文件分离) html链接跳转 网页添加图片 确认并返回资源类型 填写正文长度属性 添加表单 临时重定向 补充知识&a…

04. 函数和函数调用机制

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

Linux系统中驱动入门设备树DTS(经典)

设备树&#xff08;DTS:device tree source&#xff09;&#xff0c;字面意思就是一块电路板上设备如上图中CPU、DDR、I2C、GPIO、SPI等&#xff0c;按照树形结构描绘成的一棵树。按照策略和功能分离的思路&#xff0c;就是驱动代码&#xff08;功能&#xff09;和设备树DTS配置…

算法通关村16关 | 滑动窗口如此简单

1. 滑动窗口基本思想 滑动窗口就是快慢指针问题&#xff0c;快指针走一步&#xff0c;慢指针走一步&#xff0c;维护窗口的大小。 下图有大小为3的滑动窗口移动示例。 窗口&#xff1a;窗口是left和right之间的元素&#xff0c;也可以理解为一个区间。窗口的大小可能固定&#…

Win7设备和打印机里空白,0个对象,但是可以打印的处理办法

呉師傅 你是不是遇到过Win7系统打开设备和打印机的时候显示是空白的&#xff0c;0个设备的情况&#xff1f;要怎么操作才能解决这一问题呢&#xff0c;下面就分享一下如何处理这个问题的小方法大家可以尝试一下。 问题如下&#xff1a; 解决方法&#xff1a; 1、点击桌面左下…

Unity中Shader的消融视觉效果优化smoothstep(min,max,x)

文章目录 前言Unity中Shader的消融视觉效果优化 一、在clip(value) 的 基础上 用 smoothstep(min,max,x)&#xff0c;并且增加一个渐变纹理对消融边缘进行视觉上的优化二、进行优化 前言 Unity中Shader的消融视觉效果优化 一、在clip(value) 的 基础上 用 smoothstep(min,max…

3.0 Dubbo的可扩展机制SPI源码解析

1. Dubbo SPI 架构图 2. Demo ExtensionLoader<Protocol> extensionLoader ExtensionLoader.getExt ensionLoader(Protocol.class); Protocol http extensionLoader.getExtension("dubbo"); System.out.println(http); 上⾯这个Demo就是Dubbo常⻅的写法&am…

java八股文面试[多线程]——newWorkStealingPool

newWorkStealingPool是什么&#xff1f; newWorkStealingPool简单翻译是任务窃取线程池。 newWorkStealingPool 是Java8添加的线程池。和别的4种不同&#xff0c;它用的是ForkJoinPool。 使用ForkJoinPool的好处是&#xff0c;把1个任务拆分成多个“小任务”&#xff0c;把这…

【MySQL学习笔记】(七)内置函数

内置函数 日期函数示例案例-1案例-2 字符串函数示例 数学函数其他函数 日期函数 示例 获得当前年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-09-03 | ---------------- 1 row in set (0.00 sec)获得当前时分秒…

剑指 Offer 57 - II. 和为s的连续正数序列(简单)

题目&#xff1a; class Solution { public:vector<vector<int>> findContinuousSequence(int target) { //本题使用滑动窗口&#xff08;双指针&#xff09;int i1, j1; //定义左右边界&#xff0c;一般是左闭右开int sum0; //窗口内的和vector&…

区块链技术与应用 - 学习笔记1【引言】

大家好&#xff0c;我是比特桃。本系列主要将我之前学习区块链技术时所做的笔记&#xff0c;进行统一的优化及整合。其中大量笔记源于视频课程&#xff1a;北京大学肖臻老师《区块链技术与应用》公开课。肖老师的课让我找回了求知若渴般的感觉&#xff0c;非常享受学习这门课的…

2023/9/3周报

目录 摘要 文献阅读1 1、标题和提出问题 2、物理模型对于水质预测的缺陷 3、模型框架 4、相关公式 5、结果分析 文献阅读2 1、标题和提出问题 2、问题叙述 3、模型框架 4、误差修补 5、实验结果和分析 总结 摘要 本周阅读了2篇论文&#xff0c;分别为一种基于深…

ReactNative 井字游戏 实战

效果展示 需要的插件准备 此实战项目需要用到两个插件。 react-native-snackbar 底部信息提示组件。 react-native-vector-icons 图标组件。 安装组件&#xff1a; npm i react-native-snackbar npm i react-native-vector-icons npm i types/react-native-vector-icons /…

uni-app之android离线自定义基座

一 为什么要自定义基座 1&#xff0c;基座其实就是一个app&#xff0c;然后新开发的页面可以直接在手机上面显示&#xff0c;查看效果。 2&#xff0c;默认的基座就是uniapp帮我们打包好的基座app&#xff0c;然后我们可以进行页面的调试。 3&#xff0c;自定义基座主要用来…

Python:列表推导式

相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 列表推导式使得创建特定列表的方式更简洁。常见的用法为&#xff0c;对序列或可迭代对象中的每个元素应用某种操作&#xff0c;用生成的结果创建新的列表&#xff…

VSC++: 奇怪的风吹

void 奇怪的风吹() {//缘由https://ask.csdn.net/questions/1062454int aa[]{15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, 15, 30, 12, 36, 11, 20, 19, 17, 16, 18, 38, -1},j 0, a 0, y 0, z 0;while (aa[j] > 0){if (j && aa[j] > 35 || aa[j] < 15)…

CXL.cache D2H Message 释义

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