Go之流程控制大全: 细节、示例与最佳实践
引言
在计算机编程中,流程控制是核心的组成部分,它决定了程序应该如何根据给定的情况执行或决策。以下是Go语言所支持的流程控制结构的简要概览:
流程控制类型 | 代码 |
---|---|
if-else条件分支 | if condition { } else { } |
for循环 | for initialization; condition; post { } |
switch-case多条件分支 | switch value { case v1: ... default: ... } |
容器类型的for-range循环 | for key, value := range container { } |
接口类型的type-switch多条件分支 | switch v := value.(type) { case T: ... } |
通道类型的select-case多分支 | select { case <-ch: ... default: ... } |
break跳转语句 | break |
continue跳转语句 | continue |
goto跳转语句 | goto label |
fallthrough跳转语句 | fallthrough |
在后续部分,我们将深入探讨每种流程控制结构的细节和应用案例,帮助你更好地理解和掌握Go语言的流程控制工具。
if-else条件分支
在Go中,if-else
结构提供了条件判断的基本方式。与许多其他编程语言类似,它的基本语法包括测试一个条件,并根据该条件的真假来执行相应的代码块。
基础用法
流程控制类型 | 代码 |
---|---|
if | if condition { } |
if-else | if condition { } else { } |
if-else if-else | if condition1 { } else if condition2 { } else { } |
示例与说明
-
if
x := 10 if x > 5 {fmt.Println("x is greater than 5") }
当条件
x > 5
成立时,代码会输出 "x is greater than 5"。 -
if-else
x := 3 if x > 5 {fmt.Println("x is greater than 5") } else {fmt.Println("x is not greater than 5") }
因为
x > 5
的条件不成立,所以代码会输出 "x is not greater than 5"。 -
if-else if-else
x := 5 if x > 10 {fmt.Println("x is greater than 10") } else if x < 5 {fmt.Println("x is less than 5") } else {fmt.Println("x is 5") }
在这个示例中,由于
x
等于 5,代码会输出 "x is 5"。
带初始化语句的if条件分支
在Go中,if
语句可以包含一个初始化语句,通常用于定义在条件测试中使用的临时变量。
流程控制类型 | 代码 |
---|---|
if with initialization | if stmt; condition { } |
示例与说明
if y := computeValue(); y > 10 {fmt.Println("y is greater than 10")
} else {fmt.Println("y is not greater than 10")
}
在这个示例中,我们首先调用 computeValue() 函数(假设它返回一个整数)并将结果赋值给变量 y。然后我们根据 y > 10 的条件来决定输出什么。这种结构允许我们在一个简洁的语句中完成初始化和条件测试。
for循环
for
循环是Go语言中的唯一循环结构,但其灵活性足以覆盖其他编程语言中的多种循环结构。通过不同的组合,Go的for
循环可以模拟传统的while
和do-while
循环。
基础用法
流程控制类型 | 代码 |
---|---|
Basic loop | for initialization; condition; post { } |
While-like loop | for condition { } |
Infinite loop | for { } |
示例与说明
-
Basic loop
for i := 0; i < 5; i++ {fmt.Println(i) }
这是最常见的
for
循环形式,上述代码会输出0到4。 -
While-like loop
x := 5 for x > 0 {fmt.Println(x)x-- }
这种结构模拟了传统的
while
循环。上述代码会输出从5到1的数字。 -
Infinite loop
for {fmt.Println("This will run indefinitely!") }
除非有
break
或其他控制语句,否则这种循环会无限运行。在某些情况下,这可以用于持续等待外部输入或其他中断。
带range
的for循环
Go语言提供了for-range
结构,用于迭代数组、切片、字符串或映射的元素。
流程控制类型 | 代码 |
---|---|
Range loop | for key, value := range container { } |
示例与说明
nums := []int{1, 2, 3, 4, 5}
for idx, num := range nums {fmt.Printf("Index: %d, Value: %d\n", idx, num)
}
这个示例中,for-range循环迭代了一个整数切片,并输出每个元素及其索引。同样地,for-range可以用于迭代其他容器类型。
switch-case多条件分支
在Go语言中,switch-case
结构提供了一个清晰的方式来进行多条件判断。与其他语言的switch
结构略有不同,Go的switch
更加灵活,不仅可以用于常量和整数值,还可以用于更复杂的条件判断。
基础用法
流程控制类型 | 代码 |
---|---|
Basic switch | switch expression { case value1: ... default: ... } |
Multiple values | switch expression { case val1, val2: ... } |
No expression | switch { case condition1: ... } |
示例与说明
-
Basic switch
fruit := "apple" switch fruit { case "banana":fmt.Println("This is a banana.") case "apple":fmt.Println("This is an apple.") default:fmt.Println("Unknown fruit.") }
上述代码会输出 "This is an apple.",因为
fruit
的值是 "apple"。 -
Multiple values
day := 2 switch day { case 1, 7:fmt.Println("Weekend") case 2, 3, 4, 5, 6:fmt.Println("Weekday") default:fmt.Println("Invalid day") }
这个示例中,我们检查
day
是否是工作日还是周末。上述代码会输出 "Weekday"。 -
No expression
x := 10 switch { case x > 5:fmt.Println("x is greater than 5") case x < 5:fmt.Println("x is less than 5") default:fmt.Println("x is 5") }
在这种形式中,
switch
没有伴随的表达式,它仅仅评估case
后的条件。上述代码会输出 "x is greater than 5"。
fallthrough
关键字
在Go中,switch
的case
默认不会"贯穿"(即一旦匹配到一个case
,它就会退出switch
,不会执行后续的case
)。如果你想继续执行下一个case
,你需要使用fallthrough
关键字。
流程控制类型 | 代码 |
---|---|
Using fallthrough | case value: ... fallthrough ... |
示例与说明
value := 5
switch value {
case 5:fmt.Println("Value is 5")fallthrough
case 6:fmt.Println("Value is 6 or it fallthrough from 5")
default:fmt.Println("Another value")
}
上述代码会连续输出 "Value is 5" 和 "Value is 6 or it fallthrough from 5",因为fallthrough使得程序继续执行下一个case。
容器类型的for-range循环
在Go中,for-range
结构是处理容器类型(如数组、切片、字符串和映射)的强大工具。它可以非常方便地遍历容器中的所有元素,无需手动处理索引或键。
数组和切片
流程控制类型 | 代码 |
---|---|
遍历数组或切片 | for idx, value := range arrayOrSlice { } |
示例与说明
nums := []int{1, 2, 3, 4, 5}
for idx, num := range nums {fmt.Printf("Index: %d, Value: %d\n", idx, num)
}
此代码遍历nums切片的每一个元素,输出其索引和值。
示例与说明
str := "hello"
for idx, char := range str {fmt.Printf("Index: %d, Char: %c\n", idx, char)
}
此代码遍历str字符串中的每个字符,并输出其索引和字符值。
m := map[string]int{"a": 1, "b": 2, "c": 3}
for key, value := range m {fmt.Printf("Key: %s, Value: %d\n", key, value)
}
此代码遍历映射m中的每个键值对,输出其键和值。
总的来说,for-range结构为Go程序员提供了一个简单而强大的方式来遍历和操作容器类型的数据。通过简洁的语法,我们可以有效地处理各种容器,而无需担心复杂的索引和边界条件。
接口类型的type-switch多条件分支
在Go语言中,接口类型允许我们处理多种不同的数据类型,但有时我们需要知道接口变量的具体类型。这时,type-switch
结构提供了一种优雅的方式来进行类型判断和分支处理。
基础用法
流程控制类型 | 代码 |
---|---|
type-switch | switch v := i.(type) { case T: ... default: ... } |
示例与说明
-
基础type-switch
var i interface{} = "hello"switch v := i.(type) { case int:fmt.Printf("It's an int with value %d\n", v) case string:fmt.Printf("It's a string with value %s\n", v) default:fmt.Printf("Unknown type: %T\n", v) }
此代码首先声明了一个接口类型的变量
i
并赋值为字符串"hello"
。然后,使用type-switch
来检查i
的动态类型。上述代码将输出:"It's a string with value hello"。
type-switch
中的其他用法
type-switch
不仅限于基本类型,还可以用于自定义类型、结构体等。
流程控制类型 | 代码 |
---|---|
自定义类型 | case CustomType: ... |
结构体 | case structType: ... |
示例与说明
-
自定义类型和结构体
type MyString string type MyStruct struct {Field int }var i interface{} = MyString("hello")switch v := i.(type) { case MyString:fmt.Printf("It's a MyString with value %s\n", string(v)) case MyStruct:fmt.Printf("It's a MyStruct with field value %d\n", v.Field) default:fmt.Printf("Unknown type: %T\n", v) }
在这个示例中,我们定义了一个自定义类型
MyString
和一个结构体MyStruct
。然后,我们再次使用type-switch
来检查接口变量i
的类型。给定的代码将输出:"It's a MyString with value hello"。
总的来说,type-switch
结构为Go开发人员提供了一种清晰、简洁的方式来判断接口变量的动态类型,并进行分支处理。掌握这一结构对于在Go中正确处理接口和多态性至关重要。
通道类型的select-case多分支
Go语言中的select
关键字是用于处理多个通道的读/写操作。当我们需要同时从多个通道接收或向多个通道发送数据时,select
结构提供了一种方式来处理这些操作,使我们可以在一个通道准备好时执行相应的操作。
基础用法
流程控制类型 | 代码 |
---|---|
select-case | select { case operation1: ... case operation2: ... } |
示例与说明
-
基础select-case
ch1 := make(chan int, 1) ch2 := make(chan string, 1) ch1 <- 1 ch2 <- "hello"select { case i := <-ch1:fmt.Printf("Received from ch1: %d\n", i) case s := <-ch2:fmt.Printf("Received from ch2: %s\n", s) default:fmt.Println("No data received") }
这段代码定义了两个通道,分别发送一个整数和一个字符串。使用
select
结构,程序尝试从ch1
和ch2
中接收数据。此代码可能会输出ch1
或ch2
的数据,因为select会随机选择一个可用的case执行。
使用default
在select
结构中,可以使用default
语句来处理当所有通道都不可用时的情况。
示例与说明
-
使用default
ch := make(chan int, 1)select { case i := <-ch:fmt.Printf("Received from ch: %d\n", i) default:fmt.Println("No data available") }
在这个例子中,我们尝试从通道
ch
中接收数据。但由于没有数据发送到该通道,程序将输出"No data available"。
使用select
进行超时处理
利用select
结构,我们还可以轻松实现超时机制。
示例与说明
-
超时处理
ch := make(chan int, 1) go func() {time.Sleep(2 * time.Second)ch <- 1 }()select { case i := <-ch:fmt.Printf("Received from ch: %d\n", i) case <-time.After(1 * time.Second):fmt.Println("Timeout!") }
这段代码中,我们试图从通道
ch
中接收数据,但我们只等待1秒。使用time.After
函数,我们可以轻松实现超时逻辑。如果1秒内没有从ch
中接收到数据,程序将输出"Timeout!"。
总之,select-case
结构为Go开发人员处理多个通道提供了一种非常方便的方式。它不仅允许我们并发地处理多个通道,还可以轻松实现超时和默认操作,使并发编程变得简单而强大。
break跳转语句
在Go语言中,break
语句主要用于提前结束一个循环或switch
、select
等代码块的执行。它使我们可以在满足特定条件时跳出当前执行的代码块。
基础用法
流程控制类型 | 代码 |
---|---|
break | break |
示例与说明
-
在for循环中使用break
for i := 0; i < 10; i++ {if i == 5 {break}fmt.Println(i) }
这段代码将打印从0到4的数字。当
i
等于5时,break
语句会被触发,从而提前结束循环。 -
在switch中使用break
switch 2 { case 1:fmt.Println("Case 1") case 2:fmt.Println("Case 2")if true {break}fmt.Println("This won't be printed") case 3:fmt.Println("Case 3") }
在此示例中,当匹配到case 2时,程序会输出"Case 2",然后由于
break
语句,fmt.Println("This won't be printed")
将不会被执行。
带标签的break
在Go中,你还可以使用带标签的break
语句来跳出外层循环或其他代码块。
示例与说明
-
使用带标签的break
outerLoop: for i := 0; i < 5; i++ {for j := 0; j < 5; j++ {if i*j == 6 {break outerLoop}fmt.Println(i, j)} }
在上述代码中,我们有两个嵌套的for循环。当
i*j
等于6时,带标签的break
语句会被触发,这将导致外层的for
循环提前结束。
总体上说,break
语句在Go中提供了一种灵活的方式来控制代码块的执行流程。它在循环、switch
和select
等结构中都有着广泛的应用,使我们可以根据特定的条件提前结束代码块的执行。
continue跳转语句
在Go语言中,continue
语句被用于跳过当前循环的剩余语句,并开始下一次循环。不同于break
语句,它并不会结束整个循环,而只是跳过当前的迭代。
基础用法
流程控制类型 | 代码 |
---|---|
continue | continue |
示例与说明
-
在for循环中使用continue
for i := 0; i < 10; i++ {if i%2 == 0 {continue}fmt.Println(i) }
上述代码将打印出0到9之间的所有奇数。当
i
是偶数时,continue
语句会被触发,从而跳过当前循环的剩余部分。 -
在for-range循环中使用continue
arr := []int{1, 2, 3, 4, 5} for idx, val := range arr {if val == 3 {continue}fmt.Printf("arr[%d] = %d\n", idx, val) }
这段代码遍历一个整数切片,并打印除3之外的所有元素的索引和值。当元素值为3时,
continue
语句会被触发,从而跳过当前迭代。
带标签的continue
与break
语句类似,continue
也支持带标签的形式,从而可以在多层嵌套的循环中指定跳转到哪个外层循环的下一次迭代。
示例与说明
-
使用带标签的continue
outerLoop: for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {if i == 1 && j == 1 {continue outerLoop}fmt.Println(i, j)} }
在这个例子中,我们有两个嵌套的for循环。当
i
等于1并且j
等于1时,带标签的continue
语句会被触发,这会导致直接跳到外层循环的下一次迭代,而内层循环的剩余迭代会被跳过。
总之,continue
语句为Go开发人员提供了一种方式,可以在满足特定条件时跳过循环的某次迭代。这使得我们可以更灵活地控制循环的执行流程。
goto跳转语句
在Go语言中,goto
语句允许程序在执行时跳转到指定的标签。尽管goto
语句在现代编程中不那么常用,并且在某些情况下可能引发困惑或使代码难以阅读,但在某些特定场景中,它可能是有用的。
基础用法
流程控制类型 | 代码 |
---|---|
goto | goto |
示例与说明
-
简单的goto使用
func main() {fmt.Println("Start")goto endfmt.Println("This won't be printed") end:fmt.Println("End") }
在此示例中,程序首先打印"Start",然后跳转到
end
标签,继续执行下面的代码。因此,fmt.Println("This won't be printed")
不会被执行。 -
使用goto进行错误处理
func divide(x, y int) (int, error) {if y == 0 {return 0, errors.New("Cannot divide by zero")}return x / y, nil }func main() {result, err := divide(10, 0)if err != nil {goto handleErr}fmt.Println("Result:", result)returnhandleErr:fmt.Println("Error:", err) }
在这个例子中,我们使用
goto
语句来跳转到错误处理部分。这种做法在某些情况下可以使错误处理更为集中。
尽管goto
语句在Go中是可用的,但开发者通常建议在只有真正需要的情况下使用它,因为不当的使用可能导致代码难以理解和维护。当您可以使用其他结构(如if
、for
或switch
)来实现相同的结果时,最好避免使用goto
。
fallthrough跳转语句
在Go的switch
语句中,一旦某个case
匹配成功,后续的case
将不会再被检查或执行。然而,Go提供了一个特有的关键字:fallthrough
,它可以强制执行紧跟它后面的case
,无论该case
是否匹配。
基础用法
流程控制类型 | 代码 |
---|---|
fallthrough | fallthrough |
示例与说明
-
基础的fallthrough使用
x := 10switch x { case 10:fmt.Println("x is 10")fallthrough case 20:fmt.Println("x is 20") default:fmt.Println("x is neither 10 nor 20") }
在此示例中,
x
的值是10,所以程序会首先打印"x is 10"。由于第一个case
后面有fallthrough
语句,程序继续执行下一个case
,即使x
的值并不是20,所以还会打印"x is 20"。 -
fallthrough在非连续case中的使用
y := "apple"switch y { case "banana":fmt.Println("y is banana") case "apple":fmt.Println("y is apple")fallthrough case "orange":fmt.Println("y is orange") default:fmt.Println("y is neither banana, apple, nor orange") }
在这个例子中,当
y
的值为"apple"时,会打印"y is apple"。然后,由于存在fallthrough
语句,"y is orange"也会被打印,即使y
的值并不是"orange"。
需要注意的是,虽然fallthrough
提供了一种特殊的控制流,但在大多数场景中,过度或不恰当的使用可能导致代码难以阅读和理解。因此,推荐在真正需要时才使用它,并确保代码的意图清晰可见。
相关文章:

Go之流程控制大全: 细节、示例与最佳实践
引言 在计算机编程中,流程控制是核心的组成部分,它决定了程序应该如何根据给定的情况执行或决策。以下是Go语言所支持的流程控制结构的简要概览: 流程控制类型代码if-else条件分支if condition { } else { }for循环for initialization; con…...

FLStudio2024最新破解版注册机
水果音乐制作软件FLStudio是一款功能强大的音乐创作软件,全名:Fruity Loops Studio。水果音乐制作软件FLStudio内含教程、软件、素材,是一个完整的软件音乐制作环境或数字音频工作站... FL Studio21简称FL 21,全称 Fruity Loops Studio 21,因此国人习惯叫…...

【Overload游戏引擎细节分析】standard材质Shader
提示:Shader属于GPU编程,难写难调试,阅读本文需有一定的OpenGL基础,可以写简单的Shader,不适合不会OpenGL的朋友 一、Blinn-Phong光照模型 Blinn-Phong光照模型,又称为Blinn-phong反射模型(Bli…...

Leetcode—7.整数反转【中等】
2023每日刷题(十) Leetcode—7.整数反转 关于为什么要设long变量 参考自这篇博客 long可以表示-2147483648而且只占4个字节,所以能满足题目要求 复杂逻辑版实现代码 int reverse(int x){int arr[32] {0};long y;int flag 1;if(x <…...

lua-web-utils和proxy设置示例
以下是一个使用lua-web-utils和proxy的下载器程序: -- 首先安装lua-web-utils库 local lwu require "lwu" -- 获取服务器 local function get_proxy()local proxy_url "duoipget_proxy"local resp, code, headers, err lwu.fetch(proxy_…...

分享一下在微信小程序里怎么添加储值卡功能
在微信小程序中添加储值卡功能,可以让消费者更加便捷地管理和使用储值卡,同时也能增加商家的销售收入。下面是一篇关于如何在微信小程序中添加储值卡功能的软文。 标题:微信小程序添加储值卡功能,便捷与高效并存 随着科技的不断发…...

2023高频前端面试题-http
1. HTTP有哪些⽅法? HTTP 1.0 标准中,定义了3种请求⽅法:GET、POST、HEAD HTTP 1.1 标准中,新增了请求⽅法:PUT、PATCH、DELETE、OPTIONS、TRACE、CONNECT 2. 各个HTTP方法的具体作用是什么? 方法功能G…...

图像识别在自动驾驶汽车中的多传感器融合技术
摘要: 介绍文章的主要观点和发现。 引言: 自动驾驶汽车的兴起和重要性。多传感器融合技术在自动驾驶中的关键作用。 第一部分:图像识别技术 图像识别的基本原理。图像传感器和摄像头在自动驾驶中的应用。深度学习和卷积神经网络ÿ…...

Kafka To HBase To Hive
目录 1.在HBase中创建表 2.写入API 2.1普通模式写入hbase(逐条写入) 2.2普通模式写入hbase(buffer写入) 2.3设计模式写入hbase(buffer写入) 3.HBase表映射至Hive中 1.在HBase中创建表 hbase(main):00…...

python pandas.DataFrame 直接写入Clickhouse
import pandas as pd import sqlalchemy from clickhouse_sqlalchemy import Table, engines from sqlalchemy import create_engine, MetaData, Column import urllib.parsehost 1.1.1.1 user default password default db test port 8123 # http连接端口 engine create…...

德语中第二虚拟式在主动态的形式,柯桥哪里可以学德语
德语中第二虚拟式在主动态的形式 1. 对于大多数的动词,一般使用这样的一般现在时时态: wrde 动词原形 例句:Wenn es nicht so viel kosten wrde, wrde ich mir ein Haus am Meer kaufen. 如果不花这么多钱,我会在海边买一栋房…...

[Python进阶] 消息框、弹窗:tkinter库
6.16 消息框、弹窗:tkinter 6.16.1 前言 应用程序中的提示信息处理程序是非常重要的部分,用户要知道他输入的资料到底正不正确,或者是应用程序有一些提示信息要告诉用户,都必须通过提示信息处理程序来显示适当的信息,…...

(免费领源码)java#Springboot#mysql装修选购网站99192-计算机毕业设计项目选题推荐
摘 要 随着科学技术,计算机迅速的发展。在如今的社会中,市场上涌现出越来越多的新型的产品,人们有了不同种类的选择拥有产品的方式,而电子商务就是随着人们的需求和网络的发展涌动出的产物,电子商务网站是建立在企业与…...

生活废品回收系统 JAVA语言设计和实现
目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的生活废品回收系统包含资源类型模块、资源品类模块、回收机构模块、回收机构模块、资源销售单模块、资源交易单模块、资源交易单模块,还包含系统自带的用户管理、部门管理、角…...

redhat/centos 配置本地yum源
- 详细步骤(首先需要将iso文件上传到服务器): 1. mkdir /media/cdrom #新建镜像文件挂载目录2. cd /usr/local/src #进入系统镜像文件存放目录3. ls #列出目录文件,可以看到刚刚上传的系统镜像文件4. mount -t iso9660 -o loop /usr/local/src/rhel-s…...

FLStudio2024汉化破解版在哪可以下载?
水果音乐制作软件FLStudio是一款功能强大的音乐创作软件,全名:Fruity Loops Studio。水果音乐制作软件FLStudio内含教程、软件、素材,是一个完整的软件音乐制作环境或数字音频工作站... FL Studio21简称FL 21,全称 Fruity Loops Studio 21,因此国人习惯叫…...

Java 音频处理,音频流转音频文件,获取音频播放时长
1.背景 最近对接了一款智能手表,手环,可以应用与老人与儿童监控,环卫工人监控,农场畜牧业监控,宠物监控等,其中用到了音频传输,通过平台下发语音包,发送远程命令录制当前设备音频并…...

Spring Boot发送邮件
在现代的互联网应用中,发送电子邮件是一项常见的功能需求。Spring Boot提供了简单且强大的邮件发送功能,使得在应用中集成邮件发送变得非常容易。本文将介绍如何在Spring Boot中发送电子邮件,并提供一个完整的示例。 1. 准备工作 在开始之前…...

智慧矿山:AI算法助力!刮板机监测,生产效率和安全性提升!
工作面刮板机在煤矿等采矿场景中起着重要作用。为了提高其生产效率和安全性,研究人员开发了一种基于 AI 算法的刮板机监测技术。 在传统的刮板机监测中,通常需要人工观察和判断刮板机的状态。这种方法存在许多问题,如主观性、耗时和易出错等。…...

Qt跨平台(统信UOS)各种坑解决办法
记录Qt跨平台的坑,方便日后翻阅。 一、环境安装 本人用的是qt 5.14.2.直接在官网下载即可。地址:Index of /archive/qt/5.14/5.14.2 下载linux版本。 下载之后 添加可执行权限。 chmod 777 qt-opensource-linux-x64-5.14.2.run 然后执行。 出现坑1…...

ORB-SLAM3算法1之Ubuntu18.04+ROS-melodic安装ORB-SLAM3及各种问题解决
文章目录 0 引言1 安装依赖1.1 opencv安装1.2 Eigen3安装1.3 Pangolin安装1.4 其他2 编译安装ORB-SLAM32.1 build.sh2.2 build_ros.sh0 引言 ORB-SLAM3,在之前ORB-SLAM和ORB-SLAM2的基础上,新增了IMU多传感器融合SLAM,这是第一个能够使用针孔和鱼眼镜头模型通过单目、立体和…...

git学习笔记之用命令行解决冲突
背景 一般来说,当使用git检测到源分支和目标分支发生冲突时,我们习惯用IDE在本地进行冲突的解决,再合并、push。 但如果冲突文件不多,我们大可以直接用命令行去解决冲突。 方法 第一种方法: 找到所有的>>>…...

C语言中的内联汇编是什么?如何使用内联汇编进行底层编程?
C语言中的内联汇编是一种高级编程技术,允许开发者在C代码中嵌入汇编代码,以实现对特定处理器指令的直接控制和优化。内联汇编通常用于底层编程,例如操作系统开发、嵌入式系统编程和性能关键的应用程序。本文将详细介绍内联汇编的概念、语法和…...
react笔记基础部分(组件生命周期路由)
注意点: class是一个关键字, 类。 所以react 写class, 用classname ,会自动编译替换class 点击方法: <button onClick {this.sendData}>给父元素传值</button>常用的插件: 需要引入才能使用的…...

Sentinel授权规则和规则持久化
大家好我是苏麟 , 今天说说Sentinel规则持久化. 授权规则 授权规则可以对请求方来源做判断和控制。 授权规则 基本规则 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。 白名单:来源(origin)在白名单内的调用…...

JVM(三) 垃圾回收
一、自动垃圾回收 1.1 C/C++的内存管理 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中…...

vue3中使用svg并封装成组件
打包svg地图 安装插件 yarn add vite-plugin-svg-icons -D # or npm i vite-plugin-svg-icons -D # or pnpm install vite-plugin-svg-icons -D使用插件 vite.config.ts import { VantResolver } from unplugin-vue-components/resolvers import { createSvgIconsPlugin } from…...

实验六:DHCP、DNS、Apache、FTP服务器的安装和配置
1. (其它) 掌握Linux下DHCP、DNS、Apache、FTP服务器的安装和配置,在Linux服务器上部署JavaWeb应用 完成单元八的实训内容。 1、安装 JDK 2、安装 MySQL 3、部署JavaWeb应用 安装jdk 教程连接:linux安装jdk8详细步骤-CSDN博客 Jdk来源:linu…...

Python实验项目4 :面对对象程序设计
1:运行下面的程序,回答问题。 (1)说明程序的执行过程; (2)程序运行结果是什么? # (1)说明程序的执行过程; # (2)程序运行…...

用html、css和jQuery实现图片翻页的特效
在当今的web设计中,图片翻页特效是一种常见而且受欢迎的技术。通过图片的切换与过渡效果,能够使网页更具动感和吸引力。下面写一个简单的示例,来介绍一下如何使用html、css和jQuery实现图片翻页特效。 1,html结构 首先ÿ…...