当前位置: 首页 > news >正文

3 Go语言的变量声明

本专栏将从基础开始,循序渐进,由浅入深讲解Go语言,希望大家都能够从中有所收获,也请大家多多支持。
查看相关资料与知识库
专栏地址:Go专栏
如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。

文章目录

  • 变量声明
    • 使用 `var` 声明变量
    • 练习 1.02 – 使用 `var` 声明变量
    • 使用 `var` 一次声明多个变量
    • 练习 1.03 – 使用 `var` 一次声明多个变量
    • 跳过声明变量时的类型或值
    • 练习 1.04 – 跳过声明变量时的类型或值
    • 类型推断出错
    • 短变量声明
    • 练习 1.05 – 实现短变量声明
    • 使用短变量声明同时声明多个变量
    • 练习 1.06 – 从函数中声明多个变量
    • 使用 `var` 一行声明多个变量
    • 非英语变量名
    • 修改变量的值
    • 练习 1.07 – 修改变量的值
    • 一行中修改多个变量的值
    • 一次修改多个变量的值
    • 练习 1.08 – 一次修改多个变量的值

变量声明

现在你已经对Go语言有了初步了解并完成了第一个练习,我们将深入探讨变量。我们的第一个重点是变量的声明。

变量用来暂时存储数据,以便你可以对其进行操作。当你声明一个变量时,你需要四个要素:声明变量的语句、变量的名称、变量能够存储的数据类型以及它的初始值。幸运的是,其中一些部分是可选的,这也意味着有多种方式来定义变量。

让我们详细了解所有声明变量的方法。

使用 var 声明变量

使用 var 是声明变量的基础方式。我们将要介绍的其他方法通常是这种方式的变体,通常通过省略一些部分来实现。一个完整的 var 声明如下:

var foo string = "bar"

其中关键部分包括 varfoostring= “bar”

  • var 表示我们正在定义一个变量。
  • foo 是变量的名称。
  • string 是变量的类型。
  • = “bar” 是变量的初始值。

练习 1.02 – 使用 var 声明变量

在这个练习中,我们将使用完整的 var 语法声明两个变量,并将它们打印到控制台。你将看到 var 语法可以在代码的任何地方使用,这并不是所有变量声明语法都能做到的。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 添加所需的导入:

    import ("fmt"
    )
    
  4. 在包级作用域声明一个变量。我们将在后续详细讨论作用域:

    var foo string = "bar"
    
  5. 创建 main() 函数:

    func main() {
    
  6. 在函数内部使用 var 声明另一个变量:

      var baz string = "qux"
    
  7. 将两个变量打印到控制台:

      fmt.Println(foo, baz)
    
  8. 关闭 main() 函数:

    }
    
  9. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

预期输出结果如下:

bar qux

在这个例子中,foo 在包级别声明,而 baz 在函数级别声明。变量声明的位置很重要,因为声明变量的位置也限制了你可以使用的声明语法。

接下来,我们将看另一种使用 var 语法的方式。

使用 var 一次声明多个变量

我们可以使用一个 var 声明来定义多个变量,这可以通过 var 块或语句来实现。这种方法在声明包级变量时非常常见。变量不需要是相同的类型,并且它们可以有各自的初始值。语法如下:

var (<name1> <type1> = <value1><name2> <type2> = <value2><nameN> <typeN> = <valueN>
)

你可以有多个这种类型的声明。这是一种很好的组织相关变量的方式,使你的代码更具可读性。尽管你可以在函数中使用这种语法,但在函数中看到这种用法的情况比较少见。

练习 1.03 – 使用 var 一次声明多个变量

在这个练习中,我们将使用一个 var 语句声明多个变量,每个变量有不同的类型和初始值。然后,我们将打印每个变量的值到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 添加所需的导入:

    import ("fmt""time"
    )
    
  4. 开始 var 声明:

    var (
    
  5. 定义三个变量:

      Debug   bool   = falseLogLevel  string  = "info"startUpTime time.Time = time.Now()
    
  6. 结束 var 声明:

    )
    
  7. main() 函数中,将每个变量打印到控制台:

    func main() {fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  8. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们使用一个 var 语句声明了三个变量。你的输出结果可能会有所不同,特别是 time.Time 变量的值会随着时间而不同,但格式是相同的。

像这样使用 var 语法是一种很好的方法来保持代码的良好组织,同时也减少了输入量。

接下来,我们将开始去掉 var 语法中的一些可选部分。

跳过声明变量时的类型或值

在实际编码中,使用完整的 var 语法并不常见。通常只有在你需要定义一个具有初始值并且需要严格控制其类型的包级变量时,才会使用完整的语法。到那时,你会明显感受到类型不匹配的问题,所以现在不必太担心。其他时候,你可以省略一些可选部分,或者使用简短的变量声明方式。

在声明变量时,你不必同时包含类型和初始值。你可以只使用其中之一;Go 会处理剩下的部分。如果声明中有类型但没有初始值,Go 会使用该类型的零值。关于零值,我们将在后面章节详细讨论。另一方面,如果有初始值而没有类型,Go 会根据你使用的字面量值来推断所需的类型。

练习 1.04 – 跳过声明变量时的类型或值

在这个练习中,我们将更新之前的练习,使其跳过变量声明中的可选初始值或类型声明。然后,我们将像之前一样将这些值打印到控制台,以展示结果是一致的。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 开始多变量声明:

    var (
    
  5. 在第一次练习中,布尔值的初始值是 false,这是布尔类型的零值,因此我们可以省略其声明中的初始值:

      Debug   bool
    
  6. 其余两个变量都有非零的初始值,因此我们可以省略其类型声明:

      LogLevel  = "info"startUpTime = time.Now()
    
  7. 结束 var 声明:

    )
    
  8. main() 函数中,打印每个变量的值:

    func main() {fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  9. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

    输出显示即使在声明变量时没有提及类型,变量的值仍然正确

在这个练习中,我们能够更新之前的代码,使用更紧凑的变量声明方式。声明变量是你在编程中经常需要做的事情,省略这些冗余部分能让你的编码体验更好。

接下来,我们将探讨一种不能跳过任何部分的情况。

类型推断出错

有时你需要使用声明的所有部分——例如,当 Go 无法推断出你需要的正确类型时。以下是一个示例:

package main
import "math/rand"func main() {var seed = 1234456789rand.NewSource(seed)
}

执行以上代码会出现错误。

问题在于 rand.NewSource 需要一个 int64 类型的变量。Go 的类型推断规则会将像我们使用的数字解释为 int 类型。后续章节中,我们会详细讨论 intint64 的区别。为了解决这个问题,我们需要在声明中明确指定 int64 类型,如下所示:

package main
import "math/rand"func main() {var seed int64 = 1234456789rand.NewSource(seed)
}

接下来,我们将介绍一种更快捷的变量声明方式。

短变量声明

在函数内部声明变量时,我们可以使用 := 简写。这种简写方式允许我们使声明更加简洁。它通过省略 var 关键字,并总是从需要的初始值中推断出类型来实现这一点。

练习 1.05 – 实现短变量声明

在这个练习中,我们将更新之前的代码,使用短变量声明的方式。由于短变量声明只能在函数内使用,我们会将变量从包级别作用域移动到函数内。之前 Debug 变量有类型但没有初始值,现在我们将它更改为具有初始值,因为在使用短变量声明时这是必需的。最后,我们将打印这些变量到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 创建 main() 函数:

    func main() {
    
  5. 使用短变量声明语法声明每个变量:

      Debug := falseLogLevel := "info"startUpTime := time.Now()
    
  6. 将变量打印到控制台:

      fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  7. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们将之前的代码更新为使用非常简洁的变量声明方式,只要有初始值即可。

:= 简写在 Go 开发者中非常受欢迎,它是现实世界 Go 代码中最常见的变量定义方式。开发者喜欢它使代码简洁紧凑,同时仍然清晰明了。

另一个快捷方式是将多个变量声明在同一行。

使用短变量声明同时声明多个变量

你可以使用短变量声明同时声明多个变量。它们必须都在同一行,并且每个变量都必须有对应的初始值。其语法形式为 , , …, := , , …, 。变量名位于 := 左侧,并用 , 分隔。初始值位于 := 右侧,也用 , 分隔。左侧的第一个变量名对应右侧的第一个值。变量名和初始值的数量必须相等。

以下是一个使用之前练习代码的示例:

package mainimport ("fmt""time"
)func main() {Debug, LogLevel, startUpTime := false, "info", time.Now()fmt.Println(Debug, LogLevel, startUpTime)
}

在实际代码中,有时会看到这样的写法。虽然这种写法有点难以阅读,但它在处理函数返回多个值时非常常见。我们将在后续章节中详细讨论这一点。

练习 1.06 – 从函数中声明多个变量

在这个练习中,我们将调用一个返回多个值的函数,并将每个值赋给一个新变量。然后,我们将这些变量打印到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 创建一个返回三个值的函数:

    func getConfig() (bool, string, time.Time) {
    
  5. 在函数中返回三个字面量值,每个值用 , 分隔:

      return false, "info", time.Now()
    
  6. 关闭函数:

    }
    
  7. 创建 main() 函数:

    func main() {
    
  8. 使用短变量声明捕获函数返回的三个新变量的值:

      Debug, LogLevel, startUpTime := getConfig()
    
  9. 将这三个变量打印到控制台:

      fmt.Println(Debug, LogLevel, startUpTime)
    
  10. 关闭 main() 函数:

    }
    
  11. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们调用了一个返回多个值的函数,并使用短变量声明在一行中捕获了这些值。如果使用 var 语法,它将如下所示:

var (Debug boolLogLevel stringstartUpTime time.Time
)
Debug, LogLevel, startUpTime = getConfig()

短变量声明是一种使 Go 看起来像动态语言的关键特性。

不过,var 语法还有一个有用的技巧,我们将在接下来的内容中继续探索。

使用 var 一行声明多个变量

虽然短变量声明更常用,但你也可以使用 var 在一行中定义多个变量。需要注意的是,当声明类型时,所有的值必须具有相同的类型。如果你使用初始值,那么每个值可以根据字面量值推断其类型,因此可以有不同的类型。以下是一个示例:

package mainimport ("fmt""time"
)func getConfig() (bool, string, time.Time) {return false, "info", time.Now()
}func main() {// 仅声明类型var start, middle, end float32fmt.Println(start, middle, end)// 初始值,混合类型var name, left, right, top, bottom = "one", 1, 1.5, 2, 2.5fmt.Println(name, left, right, top, bottom)// 也适用于函数var Debug, LogLevel, startUpTime = getConfig()fmt.Println(Debug, LogLevel, startUpTime)
}

在实际应用中,短变量声明通常会更简洁,因此 var 语法不常用于多个变量的声明。唯一的例外是当你需要声明多个相同类型的变量时,这种语法可以帮助你更好地控制类型。

非英语变量名

Go 是一个支持 UTF-8 的语言,这意味着你可以使用除拉丁字母外的其他字母来定义变量名。例如,以下代码展示了如何使用不同语言的字母作为变量名:

package mainimport ("fmt""time"
)func main() {デバッグ := false日志级别 := "info"ይጀምሩ := time.Now()_A1_Μείγμα := "" fmt.Println(デバッグ, 日志级别, ይጀምሩ, _A1_Μείγμα)
}

虽然可以这样定义,但是不建议。

修改变量的值

现在我们已经定义了变量,接下来让我们看看如何修改变量的值。修改变量的值与设置初始值的语法类似,使用 = 这样的格式。

练习 1.07 – 修改变量的值

请按照以下步骤操作:

  1. 创建一个新的文件夹,并在其中添加一个 main.go 文件。

  2. main.go 中,添加 main 包名到文件的顶部:

    package main
    
  3. 导入所需的包:

    import "fmt"
    
  4. 创建 main() 函数:

    func main() {
    
  5. 声明一个变量:

      offset := 5
    
  6. 打印变量的值到控制台:

      fmt.Println(offset)
    
  7. 修改变量的值:

      offset = 10
    
  8. 再次打印变量的值,并关闭 main() 函数:

      fmt.Println(offset)
    }
    
  9. 保存文件。在新的文件夹中,运行以下命令:

    go run .
    

输出结果如下:

5
10

在这个例子中,我们将 offset 的值从初始值 5 修改为 10。任何使用原始值的地方,例如我们示例中的 510,你都可以使用变量。以下是如何使用变量替代原始值的示例:

package mainimport "fmt"var defaultOffset = 10func main() {offset := defaultOffsetfmt.Println(offset)offset = offset + defaultOffsetfmt.Println(offset)
}

输出结果如下:

10
20

在这个例子中,我们将 offset 的初始值设为 defaultOffset,然后将 offset 更新为 offset + defaultOffset。这种方法使得我们可以在代码中使用变量来替代硬编码的值,提高了代码的灵活性和可维护性。

一行中修改多个变量的值

接下来,我们将看看如何在一行中修改多个变量的值。

一次修改多个变量的值

与在一行中声明多个变量类似,你也可以在一行中同时修改多个变量的值。其语法也非常类似,格式为 , , …, = , , …,

练习 1.08 – 一次修改多个变量的值

在本练习中,我们将定义一些变量,并使用一行语句来修改它们的值。然后,我们会打印出这些变量的新值。让我们开始吧:

  1. 创建一个新的文件夹,并在其中添加一个 main.go 文件。

  2. main.go 中,添加 main 包名到文件的顶部:

    package main
    
  3. 导入所需的包:

    import "fmt"
    
  4. 创建 main() 函数:

    func main() {
    
  5. 声明我们的变量并初始化值:

      query, limit, offset := "bat", 10, 0
    
  6. 使用一行语句修改每个变量的值:

      query, limit, offset = "ball", offset, 20
    
  7. 打印这些变量的值到控制台,并关闭 main() 函数:

      fmt.Println(query, limit, offset)
    }
    
  8. 保存文件。在新的文件夹中,运行以下命令:

    go run .
    

输出结果如下,显示了一行语句中修改后的变量值:

ball 0 20

在本练习中,我们成功地在一行中修改了多个变量的值。这种方法也可以用于函数调用,就像变量声明一样。不过,你需要小心使用这种特性,确保代码首先易于阅读和理解。如果使用一行语句使得代码难以理解,那么分多行写代码可能会更清晰。

接下来,我们将探讨操作符是什么,以及它们如何被用来以有趣的方式改变你的变量。

相关文章:

3 Go语言的变量声明

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…...

PyMySQL库的使用方法

过程和步骤&#xff1a; 安装 PyMySQL 首先&#xff0c;需要使用 pip 安装 PyMySQL 库&#xff1a; pip install pymysql连接数据库 使用 PyMySQL.connect() 方法可以建立到 MySQL 数据库的连接&#xff1a; import pymysql# 配置数据库连接参数 config {host: localhost…...

iOS 创建一个私有的 CocoaPods 库

创建一个私有的 CocoaPods 库&#xff08;pod&#xff09;涉及几个步骤&#xff0c;包括设置私有的 Git 仓库、创建 Podspec 文件、发布到私有仓库等等。以下是详细步骤&#xff1a; 设置私有 Git 仓库 首先&#xff0c;在 GitHub、GitLab 或 Bitbucket 上创建一个新的私有仓库…...

Linux_实现UDP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 recvfrom 1.4 sendto 1.5 服务器代码 2、实现客户端的逻辑 2.1 客户端代码 3、实现通信 结语 前言&#xff1a; 在Linux下&#xff0c;实现传输层协议为UDP的套接字进行网络通信&#xff0c;网络层协议为IPv4&am…...

C# 代理模式

栏目总目录 概念 代理模式是一种结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中&#xff0c;我们创建一个具有现有对象&#xff08;称为“真实对象”或“被代理对象”&#xff09;相同功能的代理对象。代理对象可以在客户端和目标对…...

【1】Python机器学习之基础概念

1、什么是机器学习 最早的机器学习应用——垃圾邮件分辨 传统的计算机解决问题思路&#xff1a; 编写规则&#xff0c;定义“垃圾邮件”&#xff0c;让计算机执行对于很多问题&#xff0c;规则很难定义规则不断变化 机器学习在图像识别领域的重要应用&#xff1a; 人脸识别…...

HashMap源码解析

目录 一:put方法流程 二&#xff1a;get方法 三&#xff1a;扩容机制 一&#xff1a;put方法流程 public V put(K key, V value) {return putVal(hash(key), key, value, false, true); }final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {No…...

[Javascript】前端面试基础3【每日学习并更新10】

Web开发中会话跟踪的方法有那些 cookiesessionurl重写隐藏inputip地址 JS基本数据类型 String&#xff1a;用于表示文本数据。Number&#xff1a;用于表示数值&#xff0c;包括整数和浮点数。BigInt&#xff1a;用于表示任意精度的整数。Boolean&#xff1a;用于表示逻辑值…...

C++自定义字典树结构

代码 #include <iostream> using namespace std;class TrieNode { public:char data;TrieNode* children[26];bool isTerminal;TrieNode(char ch){data ch;for (int i 0; i < 26; i){children[i] NULL;}isTerminal false;} }; class Trie { public:TrieNode* ro…...

dockerfile部署wordpress

1.将容器直接提交成镜像 [rootlocalhost ~]# docker commit 8ecc7f6b9c12 nginx:1.1 sha256:9a2bb94ba6d8d952527df616febf3fbc8f842b3b9e28b7011b50c743cd7b233b [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx …...

CSS(二)——CSS 背景

CSS 背景 CSS 背景属性用于定义HTML元素的背景。 CSS 背景属性 Property描述background简写属性&#xff0c;作用是将背景属性设置在一个声明中。background-attachment背景图像是否固定或者随着页面的其余部分滚动。background-color设置元素的背景颜色。background-image把…...

开机出现grub无法进入系统_电脑开机出现grub解决方法

最近有小伙伴问我电脑开机出现grub无法进入系统怎么回事&#xff1f;电脑开机出grub的情况有很多&#xff0c;电脑上安装了Linux和Win10双系统&#xff0c;但是由于格式化删除了Linux之后&#xff0c;结果win10开机了之后&#xff0c;直接显示grub&#xff1e;&#xff0c;无法…...

uboot 设置bootargs配置内核网络挂载根文件系统

uboot 设置bootargs配置内核网络挂载根文件系统 uboot设置bootargs env set bootargs "mem256M consolettyAMA0,115200 root/dev/nfs init/linuxrc nfsrootnfs主机地址:nfs路径/busybox/rootfs_glibc_arm64,prototcp rw nfsvers3 rootwait ip板子地址:nfs主机地址:网关:2…...

Vue3+.NET6前后端分离式管理后台实战(三十一)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(三十一)...

22集 如何minimax密钥和groupid-《MCU嵌入式AI开发笔记》

22集 如何获取minimax密钥和groupid-《MCU嵌入式AI开发笔记》 minimax密钥获取 https://www.minimaxi.com/platform 进入minimax网站&#xff0c;注册登录后&#xff0c;进入“账户管理”&#xff0c; 然后再点击“接口密钥”&#xff0c;然后再点击“创建新的密钥”。 之…...

决策树的概念

决策树的概念 决策树是一种监督学习算法&#xff0c;主要用于分类任务。它通过构建一棵树结构模型来进行预测&#xff0c;其中每个内部节点表示一个特征属性上的判断条件&#xff0c;每条边代表一个判断结果对应的分支&#xff0c;而叶节点则代表最终的类别标签。 应用领域 …...

C++《类和对象》(中)

一、 类的默认成员函数介绍二、构造函数 构造函数名与类同名内置类型与自定义类型析构函数拷贝构造函数 C《类和对象》(中) 一、 类的默认成员函数介绍 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。 那么我们主要学习的是1&…...

SpringBoot中JSR303校验

JSR是 Java EE 的一种标准&#xff0c;用于基于注解的对象数据验证。在Spring Boot应用中&#xff0c;你可以通过添加注解直接在POJO类中声明验证规则。这样可以确保在使用这些对象进行操作之前&#xff0c;它们满足业务规则。个人认为非常有用的&#xff0c;因为它减少了代码中…...

图像数据增强方法概述

图像数据增强方法概述 1. 什么是图像数据增强技术?2. 图像数据增强技术分类2.1 几何变换Python 示例代码 2.2 颜色变换2.3 噪声添加 3. 参考文献 1. 什么是图像数据增强技术? 基础概念&#xff1a;图像增强技术是计算机视觉和图像处理领域中的一个关键技术&#xff0c;主要用…...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(五)-无人机跟踪

目录 引言 5.3 无人机跟踪 5.3.1 无人机跟踪模型 5.3.2 无人机位置报告流程 5.3.3 无人机存在监测流程 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everyth…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...