Go之流程控制大全: 细节、示例与最佳实践

本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支、for循环、switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch。文章还详细描述了gotofallthrough等跳转语句的使用方法,通过清晰的代码示例为读者提供了直观的指导。

关注【TechLead KrisChang】,分享互联网架构、云服务技术、AI技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

引言

在计算机编程中,流程控制是核心的组成部分,它决定了程序应该如何根据给定的情况执行或决策。以下是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结构提供了条件判断的基本方式。与许多其他编程语言类似,它的基本语法包括测试一个条件,并根据该条件的真假来执行相应的代码块。

基础用法

流程控制类型代码
ifif condition { }
if-elseif condition { } else { }
if-else if-elseif condition1 { } else if condition2 { } else { }
示例与说明
  1. if

    x := 10
    if x > 5 {
        fmt.Println("x is greater than 5")
    }
    

    当条件 x > 5 成立时,代码会输出 “x is greater than 5”。

  2. 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”。

  3. 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 initializationif 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循环可以模拟传统的whiledo-while循环。

基础用法

流程控制类型代码
Basic loopfor initialization; condition; post { }
While-like loopfor condition { }
Infinite loopfor { }
示例与说明
  1. Basic loop

    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    

    这是最常见的for循环形式,上述代码会输出0到4。

  2. While-like loop

    x := 5
    for x > 0 {
        fmt.Println(x)
        x--
    }
    

    这种结构模拟了传统的while循环。上述代码会输出从5到1的数字。

  3. Infinite loop

    for {
        fmt.Println("This will run indefinitely!")
    }
    

    除非有break或其他控制语句,否则这种循环会无限运行。在某些情况下,这可以用于持续等待外部输入或其他中断。

range的for循环

Go语言提供了for-range结构,用于迭代数组、切片、字符串或映射的元素。

流程控制类型代码
Range loopfor 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 switchswitch expression { case value1: ... default: ... }
Multiple valuesswitch expression { case val1, val2: ... }
No expressionswitch { case condition1: ... }
示例与说明
  1. 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”。

  2. 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”。

  3. 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中,switchcase默认不会"贯穿"(即一旦匹配到一个case,它就会退出switch,不会执行后续的case)。如果你想继续执行下一个case,你需要使用fallthrough关键字。

流程控制类型代码
Using fallthroughcase 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切片的每一个元素,输出其索引和值。
file

示例与说明

str := "hello"
for idx, char := range str {
    fmt.Printf("Index: %d, Char: %c\n", idx, char)
}

此代码遍历str字符串中的每个字符,并输出其索引和字符值。

file

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-switchswitch v := i.(type) { case T: ... default: ... }
示例与说明
  1. 基础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: ...
示例与说明
  1. 自定义类型和结构体

    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-caseselect { case operation1: ... case operation2: ... }
示例与说明
  1. 基础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结构,程序尝试从ch1ch2中接收数据。此代码可能会输出ch1ch2的数据,因为select会随机选择一个可用的case执行。

使用default

select结构中,可以使用default语句来处理当所有通道都不可用时的情况。

示例与说明
  1. 使用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结构,我们还可以轻松实现超时机制。

示例与说明
  1. 超时处理

    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语句主要用于提前结束一个循环或switchselect等代码块的执行。它使我们可以在满足特定条件时跳出当前执行的代码块。

基础用法

流程控制类型代码
breakbreak
示例与说明
  1. 在for循环中使用break

    for i := 0; i < 10; i++ {
        if i == 5 {
            break
        }
        fmt.Println(i)
    }
    

    这段代码将打印从0到4的数字。当i等于5时,break语句会被触发,从而提前结束循环。

  2. 在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语句来跳出外层循环或其他代码块。

示例与说明
  1. 使用带标签的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中提供了一种灵活的方式来控制代码块的执行流程。它在循环、switchselect等结构中都有着广泛的应用,使我们可以根据特定的条件提前结束代码块的执行。


continue跳转语句

在Go语言中,continue语句被用于跳过当前循环的剩余语句,并开始下一次循环。不同于break语句,它并不会结束整个循环,而只是跳过当前的迭代。

基础用法

流程控制类型代码
continuecontinue
示例与说明
  1. 在for循环中使用continue

    for i := 0; i < 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Println(i)
    }
    

    上述代码将打印出0到9之间的所有奇数。当i是偶数时,continue语句会被触发,从而跳过当前循环的剩余部分。

  2. 在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也支持带标签的形式,从而可以在多层嵌套的循环中指定跳转到哪个外层循环的下一次迭代。

示例与说明
  1. 使用带标签的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 语句在现代编程中不那么常用,并且在某些情况下可能引发困惑或使代码难以阅读,但在某些特定场景中,它可能是有用的。

基础用法

流程控制类型代码
gotogoto
示例与说明
  1. 简单的goto使用

    func main() {
        fmt.Println("Start")
        goto end
        fmt.Println("This won't be printed")
    end:
        fmt.Println("End")
    }
    

    在此示例中,程序首先打印"Start",然后跳转到end标签,继续执行下面的代码。因此,fmt.Println("This won't be printed") 不会被执行。

  2. 使用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)
        return
    
    handleErr:
        fmt.Println("Error:", err)
    }
    

    在这个例子中,我们使用goto语句来跳转到错误处理部分。这种做法在某些情况下可以使错误处理更为集中。

尽管goto语句在Go中是可用的,但开发者通常建议在只有真正需要的情况下使用它,因为不当的使用可能导致代码难以理解和维护。当您可以使用其他结构(如ifforswitch)来实现相同的结果时,最好避免使用goto


fallthrough跳转语句

在Go的switch语句中,一旦某个case匹配成功,后续的case将不会再被检查或执行。然而,Go提供了一个特有的关键字:fallthrough,它可以强制执行紧跟它后面的case,无论该case是否匹配。

基础用法

流程控制类型代码
fallthroughfallthrough
示例与说明
  1. 基础的fallthrough使用

    x := 10
    
    switch 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"。

  2. 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提供了一种特殊的控制流,但在大多数场景中,过度或不恰当的使用可能导致代码难以阅读和理解。因此,推荐在真正需要时才使用它,并确保代码的意图清晰可见。


关注【TechLead KrisChang】,分享互联网架构、云服务技术、AI技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gradio进度条实现不成功,使用components替代

实现了一个功能&#xff0c;上传一个图像后自动调用函数做算法处理&#xff0c;但是网页如果静止&#xff0c;等待的这段时间会令人怀疑&#xff0c;是不是真的在处理&#xff0c;处理的时长是多少&#xff1f; 首先查了下进度条的实现&#xff0c;有个Progress的函数&#xf…

什么是高级持续性威胁(APT)

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求&#xff0c;研究了实现…

C++开发基础之预编译头文件 stdafx.h的作用

引言 在 C 开发中&#xff0c;为了提高编译效率和减少重复编译的时间&#xff0c;我们可以使用 stdafx.h 这个预编译头文件。本文将介绍 stdafx.h 是什么&#xff0c;以及它在 C 项目中的作用。 1、什么是 stdafx.h&#xff1f; stdafx.h 是一个预编译头文件&#xff0c;在 …

Synchronized作用

synchronized能够在同一时刻最多只有一个线程执行该代码 证明如下&#xff1a; public class MyThread {public static void main(String[] args) throws InterruptedException {Ticket ticket new Ticket();Thread aa new Thread(() -> {try {ticket.getCount();} catc…

UnityShader(十二)实现标准光照模型中的高光反射

目录 基本光照模型中的高光反射公式&#xff1a; 逐顶点光照 逐像素光照 基本光照模型中的高光反射公式&#xff1a; 从公式可以看出 要计算高光反射需要知道四个参数&#xff1a;入射光线的颜色和强度clight&#xff0c;材质的高光反射系数mspecular&#xff0c;视角方向v以…

UE4 C++ 结构体

先在UCLASS()前写入&#xff1a; USTRUCT(BlueprintType) struct FMyStruct //必须以"F"开头 {GENERATED_BODY() //必须添加“GENERATED_BODY()”UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyStruct1")int32 Health;UPROPERTY(EditAnywher…

编程流程图

对于复杂流程&#xff0c;我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下&#xff1a; processOn&#xff1a; 这个是我之前 一直的选择&#xff0c;他可以画上面的这些&#xff0c;流程图&#xff0c;网页操作&#xff0c;但是他不是免费的&#xff0c;查过…

纯血鸿蒙来了,鸿蒙App开发该如何提速

“全世界做产品挣钱的公司很多&#xff0c;但有能力打造操作系统的公司没有几家&#xff0c;最后世界上的操作系统就只有三套&#xff1a;鸿蒙、iOS和安卓。” --- 360集团创始人、董事长周鸿祎 “HarmonyOS实现了AI框架、大模型、设计系统、编程框架、编程语言、编译器等全栈…

力扣经典题目:循环队列

1.虽然是循环队列&#xff0c;但需要提供一个队列为满的情况&#xff0c;所以&#xff0c;要设立一个空的队列元素&#xff0c;当最后一个元素的next指针加一等于第一个元素的时候为满 2.可以增加一个size记录元素个数&#xff0c;当size为0的时候为空&#xff0c;当size为目标…

Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine

PartitionLeaderSelector 通过对前面的分析可知&#xff0c;PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现&#xff0c;PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…

收集子域名信息(二):第三方网站查询

一、介绍 通过第三方网站查询子域名信息是指使用外部提供的在线工具或服务&#xff0c;通过输入主域名&#xff08;主网站的域名&#xff09;来获取与该主域名相关的子域名列表的过程。子域名是在主域名下创建的附加标识&#xff0c;通常用于将网站内容组织成不同部分或为特定…

如何使用mock.js实现接口测试的自动化?

Mock.js 基础用法介绍 Mock.js是一个常用于生成随机数据和拦截Ajax请求的JavaScript库。本文将介绍Mock.js的用法&#xff0c;包括安装和基础用法&#xff0c;在开始前我们可以看下看&#xff1a;了解 Mock.js 的语法规范。 安装 可以通过npm安装Mock.js&#xff1a; npm i…

2024年【汽车驾驶员(高级)】模拟试题及汽车驾驶员(高级)理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;高级&#xff09;模拟试题是安全生产模拟考试一点通总题库中生成的一套汽车驾驶员&#xff08;高级&#xff09;理论考试&#xff0c;安全生产模拟考试一点通上汽车驾驶员&#xff08;高级&…

动画学习:CSP动画制作

会画画就能做手书&#xff1f;&#xff01;真动画入门教程&#xff01;【优动漫/CSP教程】https://www.bilibili.com/video/BV1ku411S7Ey/?spm_id_from333.337.search-card.all.click&vd_source124076d7d88eee393a1d8bf6fc787efa 有些人用的是优动漫软件&#xff0c;但是…

现在普通人的消费选择发生了怎样的变化?

消费选择的变化&#xff1a;现代普通人消费观念的演变 随着社会的进步和经济的发展&#xff0c;现代普通人的消费选择发生了翻天覆地的变化。这种变化不仅体现在物质生活的丰富上&#xff0c;更反映在人们消费观念的转变上。 在过去&#xff0c;人们的消费选择相对单一&#…

网络层 IP协议(1)

前置知识 主机:配有IP地址,但是不进行路由控制的设备 路由器:既配置了IP地址,又能进行路由控制的设备 节点:主机和路由器的总称 IP协议主要完成的任务就是 地址管理和路由选择 地址管理:使用一套地址体系,将网络设备的地址描述出来 路由选择:一个数据报如何从源地址到目的地址 …

C++ : 类的简单介绍(四)——析构函数

概念&#xff1a; 与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由 编译器完成的。 而对象在销毁时会自动调用析构函数&#xff0c;完成对象中资源的清理工作。 特征&#xff1a; 1. 析构函数名是在类名前加上字符 ~ 2. …

大数据分析|从七个特征理解大数据分析

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

【Zotero】如何在word文档中插入zotero中的文献

博主最近在用zotero管理文献&#xff0c;并在word文档中写文章&#xff0c;期间需要将zotero生成的参考文献插入文章中&#xff0c;这里将博主遇到的问题以及解决的办法分享给大家&#xff0c;供咱们一起学习。 博主遇到的问题主要有以下几个&#xff1a; 1、参考文献的格式以…