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

第一讲:Go语言开发入门:环境搭建与基础语法

文章目录

    • 环境搭建
      • windows环境搭建
      • Mac环境搭建
        • 安装GO
          • 使用 Homebrew 安装 Go
          • 手动下载安装 Go
        • 配置环境变量
          • 配置环境变量
          • 检查 Go 是否正确安装
        • 验证安装:编写第一个 Go 程序
          • 创建 Go 工作区
          • 编写 Hello World 程序
          • 运行程序
          • 编译程序
        • 常用的 Go 命令
    • Go语言基础语法
      • 1. 变量(Variables)
      • 2. 常量(Constants)
      • 3. 计算符号(Operators)
      • 4. 字符串(Strings)
      • 5. 条件表达式(Condition Expressions)
      • 6. 分支表达式(Switch Statements)
      • 7. 循环(Loops)
      • 8. 数组(Arrays)
      • 9. 切片(Slices)
      • 10. Map(字典)
      • 11. 简单函数(Functions)
    • 两个小练习
      • 练习 1:计算多个人的平均体脂
      • 练习 2:判断两条线是否平行

环境搭建

windows环境搭建

参考之前博客:Go语言入门:从零开始的快速指南

Mac环境搭建

安装GO
使用 Homebrew 安装 Go

Homebrew 是 macOS 上常用的包管理工具,使用 Homebrew 安装 Go 非常简单。

  1. 打开终端(Terminal)。

  2. 确保你已经安装了 Homebrew。如果没有安装,可以使用以下命令进行安装:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
  3. 使用 Homebrew 安装 Go:

    brew install go
    

    安装完成后,Go 的执行文件和相关工具将会被安装到 /usr/local/bin/ 中,默认版本是最新稳定版。

手动下载安装 Go

如果你不使用 Homebrew,也可以手动从官网下载安装:

  1. 访问 Go 官方下载页面。
  2. 下载适用于 macOS 的安装包(通常是 .pkg 文件)。
  3. 下载完成后,双击安装包并按照提示进行安装。

安装成功后,Go 会被安装到 /usr/local/go 目录。

配置环境变量

Go 的安装目录 /usr/local/go 包含了 Go 的所有工具和命令行工具。为了让系统知道 Go 的位置,我们需要配置 Go 的 GOPATHGOROOT 环境变量。

配置环境变量
  1. 打开终端,编辑你的 ~/.zshrc 文件(macOS 默认使用 Zsh,或者你使用的是 Bash 则编辑 ~/.bash_profile):

    nano ~/.zshrc
    
  2. 在文件末尾添加以下内容:

    # Go 环境变量配置
    export GOPATH=$HOME/go
    export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
    
    • GOPATH:这是 Go 的工作区目录,存储你的 Go 项目和依赖。默认建议使用 ~/go 目录。
    • PATH:将 Go 的二进制文件添加到 PATH 中,确保你可以在任何地方使用 Go 的命令。
  3. 保存文件并退出(按 Ctrl + O 保存,按 Ctrl + X 退出)。

  4. 运行以下命令使配置立即生效:

    source ~/.zshrc
    
检查 Go 是否正确安装

在终端输入以下命令来检查 Go 是否成功安装:

go version

如果安装成功,你会看到类似以下的输出:

go version go1.23.1 darwin/arm64
验证安装:编写第一个 Go 程序

接下来,我们编写一个简单的 Go 程序来验证安装是否成功。

创建 Go 工作区

首先,在 GOPATH 中创建一个 Go 项目的工作目录:

mkdir -p ~/go/src/hello
cd ~/go/src/hello
编写 Hello World 程序

在该目录下创建一个名为 main.go 的文件,并写入以下内容:

package mainimport "fmt"func main() {fmt.Println("Hello, Go!")
}
运行程序

在终端中运行以下命令来编译并执行这个 Go 程序:

go run main.go

你应该会看到以下输出:

Hello, Go!
编译程序

如果你希望将程序编译成可执行文件,可以使用 go build 命令:

go build

编译完成后,你会在当前目录下看到一个名为 hello(或者 hello.exe,如果你在 Windows 上运行)的可执行文件。你可以直接运行它:

./hello

你将再次看到 Hello, Go! 的输出。

常用的 Go 命令

以下是一些常用的 Go 命令,可以帮助你在开发中快速上手:

  • go run:直接运行 Go 源代码文件。
  • go build:编译源代码,生成可执行文件。
  • go install:编译并安装包和依赖。
  • go fmt:格式化 Go 源代码文件。
  • go test:运行单元测试。
  • go get:下载和安装远程包。
  • go doc:查看 Go 包的文档。

Go语言基础语法

1. 变量(Variables)

在 Go 中,变量通过 var 关键字声明。

package mainimport "fmt"func main() {// 声明一个整型变量var a int = 10// 声明一个字符串变量var str string = "Hello, Go!"// 使用类型推断(编译器会自动推断类型)var b = 20// 简短声明(只能在函数内使用)c := 30fmt.Println(a, str, b, c)
}

变量相关知识:

  • 使用 var 关键字可以声明变量。
  • 通过 := 进行简短声明,不需要 var 关键字,只能在函数内部使用。
  • Go 是静态类型语言,变量类型在编译时就确定,不能改变。

2. 常量(Constants)

常量通过 const 关键字声明,常量的值在编译时就确定,不能被修改。

package mainimport "fmt"func main() {const pi = 3.14159const str = "Hello, Go!"fmt.Println(pi, str)
}

常量相关知识:

  • 常量的值必须是编译时确定的,不能运行时赋值。
  • 常量可以是数值、字符串、布尔值等。

3. 计算符号(Operators)

Go 支持常见的算术运算符、关系运算符和逻辑运算符:

package mainimport "fmt"func main() {a, b := 10, 20// 算术运算符fmt.Println("加法: ", a+b)fmt.Println("减法: ", a-b)fmt.Println("乘法: ", a*b)fmt.Println("除法: ", a/b)fmt.Println("取模: ", a%b)// 关系运算符fmt.Println("相等: ", a == b)fmt.Println("不等: ", a != b)fmt.Println("大于: ", a > b)fmt.Println("小于: ", a < b)// 逻辑运算符fmt.Println("逻辑与: ", a > 5 && b > 15)fmt.Println("逻辑或: ", a > 15 || b > 15)fmt.Println("逻辑非: ", !(a > 15))
}

4. 字符串(Strings)

字符串是不可变的 Unicode 字符序列,可以通过 " 包含字符串,或者通过反引号 包含多行字符串。

package mainimport "fmt"func main() {var str1 string = "Hello"str2 := "World"// 多行字符串str3 := `这是多行字符串`// 字符串拼接combined := str1 + ", " + str2fmt.Println(combined)fmt.Println(str3)
}

字符串相关知识:

  • 使用 + 可以拼接字符串。
  • 使用反引号可以定义多行字符串。

5. 条件表达式(Condition Expressions)

Go 中的条件表达式使用 ifelse,条件表达式不需要用括号包裹。

package mainimport "fmt"func main() {a := 10if a > 5 {fmt.Println("a 大于 5")} else {fmt.Println("a 小于或等于 5")}// 带初始化的 if 语句if b := a * 2; b > 15 {fmt.Println("b 大于 15")} else {fmt.Println("b 小于或等于 15")}
}

6. 分支表达式(Switch Statements)

switch 语句是 Go 中多分支选择的常用方法。

package mainimport "fmt"func main() {a := 2switch a {case 1:fmt.Println("a 等于 1")case 2:fmt.Println("a 等于 2")default:fmt.Println("a 不等于 1 或 2")}
}

switch 的特点:

  • switch 不需要像其他语言中那样使用 break,每个 case 执行完毕后会自动结束。
  • 可以在 case 中进行条件匹配。

7. 循环(Loops)

Go 只有一种循环结构 for,没有 whiledo-while

package mainimport "fmt"func main() {// 基本的 for 循环for i := 0; i < 5; i++ {fmt.Println(i)}// 类似 while 的 for 循环i := 0for i < 5 {fmt.Println(i)i++}// 无限循环// for {//     fmt.Println("无限循环")// }
}

8. 数组(Arrays)

数组是具有固定长度的同类型元素序列。

package mainimport "fmt"func main() {var arr [5]int // 定义一个长度为5的数组arr[0] = 1arr[1] = 2// 初始化时直接赋值arr2 := [3]int{1, 2, 3}fmt.Println(arr)fmt.Println(arr2)
}

数组相关知识:

  • 数组的长度是固定的,一旦声明,长度就不能改变。

9. 切片(Slices)

切片是基于数组的动态大小的序列,比数组更加灵活。

package mainimport "fmt"func main() {// 声明并初始化切片var slice []int = []int{1, 2, 3}// 使用 append 添加元素slice = append(slice, 4)// 通过切片创建切片newSlice := slice[1:3]fmt.Println(slice)fmt.Println(newSlice)
}

切片相关知识:

  • 切片是一种引用类型,指向底层数组。
  • 使用 append 函数可以动态地向切片添加元素。

10. Map(字典)

Map 是键值对的集合,可以通过键快速查找对应的值。

package mainimport "fmt"func main() {// 创建一个 mapvar myMap map[string]int = map[string]int{"Alice": 25,"Bob":   30,}// 添加元素myMap["Charlie"] = 35// 查找元素age := myMap["Alice"]// 判断键是否存在age, exists := myMap["David"]if exists {fmt.Println("David 的年龄是", age)} else {fmt.Println("David 不存在")}fmt.Println(myMap)
}

11. 简单函数(Functions)

Go 中的函数通过 func 关键字定义,可以返回多个值。

package mainimport "fmt"// 定义一个返回两个整数相加的函数
func add(a int, b int) int {return a + b
}// 定义一个返回多个值的函数
func swap(a, b int) (int, int) {return b, a
}func main() {result := add(3, 4)fmt.Println("3 + 4 =", result)x, y := swap(10, 20)fmt.Println("交换后:", x, y)
}

函数相关知识:

  • 函数可以有多个返回值。
  • 参数类型相同的参数可以合并写在一起,如 (a, b int)
  • 返回值类型写在函数名和参数列表之后。

两个小练习

练习 1:计算多个人的平均体脂

  • 实现完整的体脂计算器
  • 连续输入三人的姓名、性别、身高、体重、年龄信息
  • 计算每个人的 BMI、体脂率

输出:

  • 每个人姓名、BMI、体脂率、建议
  • 总人数、平均体脂率

运用到的知识:

  1. 变量和常量
    • 声明和使用变量来存储用户输入的身高、体重、年龄等信息。
    • 使用 := 进行简短声明,比如 a := 10
  2. 输入和输出
    • 使用 fmt.Scanln 来获取用户输入,并使用 fmt.Println 输出结果。
  3. 条件表达式
    • 使用 if 语句来判断体脂率的不同范围,并给出不同的健康建议。
  4. 循环
    • 使用 for 循环来处理多个人的输入和体脂计算。
  5. 函数
    • 编写了多个函数,如 calculateBMIcalculateBodyFatRategiveSuggestion,这些函数帮助简化代码结构并实现代码复用。
  6. 数组和切片
    • 使用了数组来存储每个人的信息,如身高、体重、年龄等。
    • 切片可以方便地处理可变大小的数据集合。
package mainimport ("fmt"
)func main() {// 定义数组来存储姓名、性别、身高、体重、年龄、BMI 和体脂率var names [3]stringvar genders [3]stringvar heights [3]float64var weights [3]float64var ages [3]intvar BMIs [3]float64var bodyFatRates [3]float64// 输入三个人的信息for i := 0; i < 3; i++ {fmt.Printf("请输入第 %d 个人的信息:\n", i+1)fmt.Print("姓名: ")fmt.Scan(&names[i])fmt.Print("性别 (male/female): ")fmt.Scan(&genders[i])fmt.Print("身高 (米): ")fmt.Scan(&heights[i])fmt.Print("体重 (公斤): ")fmt.Scan(&weights[i])fmt.Print("年龄: ")fmt.Scan(&ages[i])// 计算 BMIBMIs[i] = calculateBMI(heights[i], weights[i])// 计算体脂率bodyFatRates[i] = calculateBodyFatRate(genders[i], BMIs[i], ages[i])}// 输出每个人的BMI、体脂率和建议for i := 0; i < 3; i++ {fmt.Printf("\n姓名: %s\n", names[i])fmt.Printf("BMI: %.2f\n", BMIs[i])fmt.Printf("体脂率: %.2f%%\n", bodyFatRates[i])fmt.Println(giveSuggestion(bodyFatRates[i], genders[i]))}// 计算并输出平均体脂率calculateAndPrintAverageBodyFatRate(bodyFatRates[:])
}// 计算 BMI
func calculateBMI(height, weight float64) float64 {return weight / (height * height)
}// 计算体脂率
func calculateBodyFatRate(gender string, BMI float64, age int) float64 {if gender == "male" {return (1.20 * BMI) + (0.23 * float64(age)) - 16.2}return (1.20 * BMI) + (0.23 * float64(age)) - 5.4
}// 根据体脂率给出建议
func giveSuggestion(bodyFatRate float64, gender string) string {var suggestion stringif gender == "male" {switch {case bodyFatRate < 10:suggestion = "建议:过瘦,适当增加体重。"case bodyFatRate >= 10 && bodyFatRate < 20:suggestion = "建议:体脂正常,保持良好状态。"case bodyFatRate >= 20 && bodyFatRate < 25:suggestion = "建议:体脂偏高,适当控制体重。"default:suggestion = "建议:肥胖,建议制定减脂计划。"}} else {switch {case bodyFatRate < 20:suggestion = "建议:过瘦,适当增加体重。"case bodyFatRate >= 20 && bodyFatRate < 30:suggestion = "建议:体脂正常,保持良好状态。"case bodyFatRate >= 30 && bodyFatRate < 35:suggestion = "建议:体脂偏高,适当控制体重。"default:suggestion = "建议:肥胖,建议制定减脂计划。"}}return suggestion
}// 计算并输出平均体脂率
func calculateAndPrintAverageBodyFatRate(bodyFatRates []float64) {totalBodyFat := 0.0for _, bodyFatRate := range bodyFatRates {totalBodyFat += bodyFatRate}averageBodyFatRate := totalBodyFat / float64(len(bodyFatRates))fmt.Printf("\n总人数: %d\n", len(bodyFatRates))fmt.Printf("平均体脂率: %.2f%%\n", averageBodyFatRate)
}

说明:

  1. 数组存储

    • 使用 namesgendersheightsweightsagesBMIsbodyFatRates 这几个数组分别存储每个人的信息。
    • 每个数组的长度为3,适用于存储三个人的数据。
  2. 函数封装

    • calculateBMI:根据身高和体重计算 BMI。
    • calculateBodyFatRate:根据性别、BMI 和年龄计算体脂率。
    • giveSuggestion:根据体脂率给出建议。
    • calculateAndPrintAverageBodyFatRate:计算并输出平均体脂率。
  3. 示例输入/输出

请输入第 1 个人的信息:
姓名: 张三
性别 (male/female): male
身高 (米): 1.75
体重 (公斤): 70
年龄: 30

请输入第 2 个人的信息:
姓名: 李四
性别 (male/female): female
身高 (米): 1.65
体重 (公斤): 68
年龄: 28

请输入第 3 个人的信息:
姓名: 王五
性别 (male/female): male
身高 (米): 1.80
体重 (公斤): 85
年龄: 35

姓名: 张三
BMI: 22.86
体脂率: 19.55%
建议:体脂正常,保持良好状态。

姓名: 李四
BMI: 24.98
体脂率: 31.27%
建议:肥胖,建议制定减脂计划。

姓名: 王五
BMI: 26.23
体脂率: 24.80%
建议:体脂偏高,适当控制体重。

总人数: 3
平均体脂率: 25.87%

练习 2:判断两条线是否平行

编写一个程序来判断两条直线是否平行。你需要通过两点计算每条线的斜率,并比较两条线的斜率是否相等,来确定它们是否平行。

运用到的知识:

  1. 变量

    • 使用 var:= 声明变量,存储用户输入的点坐标。
  2. 输入和输出

    • 使用 fmt.Scanln 获取用户输入,并用 fmt.Println 输出结果。
  3. 条件表达式

    • 使用 if 语句来判断两条线是否垂直(即 x 坐标相同),如果两条线都垂直,它们就是平行的。
  4. 函数

    • 使用了函数 calculateSlope 来计算斜率,areLinesParallel 来判断两条线是否平行,这些函数让代码结构更加清晰。

通过比较两条线的斜率来判断它们是否平行。两点决定一条直线,斜率的公式为: 斜率 = y 2 − y 1 x 2 − x 1 \text{斜率} = \frac{y_2 - y_1}{x_2 - x_1} 斜率=x2x1y2y1。如果两条线的斜率相同,那么它们就是平行的。需要注意的是,当两点的 x 1 = = x 2 x_1 == x_2 x1==x2 时,斜率不存在(垂直线)。

package mainimport ("fmt"
)// 计算两点间的斜率
func calculateSlope(x1, y1, x2, y2 float64) (float64, bool) {// 如果两点的x坐标相同,斜率不存在,返回false表示斜率不存在(垂直线)if x1 == x2 {return 0, false}// 计算斜率slope := (y2 - y1) / (x2 - x1)return slope, true
}// 判断两条直线是否平行
func areLinesParallel(x1, y1, x2, y2, x3, y3, x4, y4 float64) bool {// 计算两条线的斜率slope1, exists1 := calculateSlope(x1, y1, x2, y2)slope2, exists2 := calculateSlope(x3, y3, x4, y4)// 如果一条线是垂直线,而另一条不是,则不平行if !exists1 && !exists2 {return true // 两条线都垂直,平行} else if !exists1 || !exists2 {return false // 一条垂直,另一条不垂直,不平行}// 如果斜率相等,说明平行return slope1 == slope2
}func main() {var x1, y1, x2, y2 float64var x3, y3, x4, y4 float64// 输入第一条线的两点坐标fmt.Println("请输入第一条直线的两个点坐标:")fmt.Print("点1 (x1, y1): ")fmt.Scan(&x1, &y1)fmt.Print("点2 (x2, y2): ")fmt.Scan(&x2, &y2)// 输入第二条线的两点坐标fmt.Println("请输入第二条直线的两个点坐标:")fmt.Print("点3 (x3, y3): ")fmt.Scan(&x3, &y3)fmt.Print("点4 (x4, y4): ")fmt.Scan(&x4, &y4)// 判断两条线是否平行if areLinesParallel(x1, y1, x2, y2, x3, y3, x4, y4) {fmt.Println("这两条线是平行的")} else {fmt.Println("这两条线不平行")}
}

说明:

  1. calculateSlope :计算给定两点间的斜率,如果两点的 x 坐标相同,返回 false 表示垂直线。
  2. areLinesParallel :比较两条线的斜率,判断它们是否平行。如果斜率相等,则平行;如果一条线垂直而另一条线不垂直,则不平行。

示例输入/输出:

请输入第一条直线的两个点坐标:
点1 (x1, y1): 1 1
点2 (x2, y2): 3 3
请输入第二条直线的两个点坐标:
点3 (x3, y3): 2 2
点4 (x4, y4): 4 4
这两条线是平行的

相关文章:

第一讲:Go语言开发入门:环境搭建与基础语法

文章目录 环境搭建windows环境搭建Mac环境搭建安装GO使用 Homebrew 安装 Go手动下载安装 Go 配置环境变量配置环境变量检查 Go 是否正确安装 验证安装&#xff1a;编写第一个 Go 程序创建 Go 工作区编写 Hello World 程序运行程序编译程序 常用的 Go 命令 Go语言基础语法1. 变量…...

Linux CentOS stream9配置本地yum源

在Linux系统中,yum源配置是一个重要的环节。把系统安装时配置的国外yum源转换为国内yum源,能够帮助系统快速安装软件包。对于网络环境不稳定或无法联网的系统,配置本地yum源,可以让用户在离线状态下也能进行软件包的安装,十分重要。 一、国内源 在使用Linux的日常工作中…...

std::string

std::string是C标准库中的一个基本类模板&#xff0c;专门用于处理字符串。它提供了一个可变长度的字符序列&#xff0c;以及一系列用于字符串操作的方法。std::string是值类型&#xff0c;这意味着当它作为函数参数传递或赋值时&#xff0c;整个字符串数据会被复制。 std::st…...

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…...

Java GC 分类,8和9使用的哪种?

Java的垃圾收集器&#xff08;Garbage Collector, GC&#xff09;负责自动管理内存&#xff0c;回收不再使用的对象所占用的空间。随着JVM的发展&#xff0c;出现了多种不同特性的垃圾收集器来适应不同的应用场景和性能需求。在Java 8中&#xff0c;主要有以下几种垃圾收集器&a…...

【Docker从入门到进阶】01.介绍 02.基础使用

1. 介绍 1.1. 什么是 Docker Docker 是一个开源的平台&#xff0c;用于开发、发布和运行应用程序。它使开发者能够以更精简的方式封装应用及其依赖&#xff0c;做到“打包一次&#xff0c;到处运行”。通过 Docker&#xff0c;您可以创建轻量级、可移植的容器&#xff0c;每个…...

GraphRAG-Local-UI - 基于 GraphRAG 支持本地的聊天UI

文章目录 一、关于 GraphRAG-Local-UI &#x1f578;️特点&#x1f31f;&#x1f5fa;️路线图最近更新即将推出的功能 二、&#x1f4e6;安装和设置三、使用入门&#x1f680;1、创建索引目录2、添加示例数据&#xff08;可选&#xff09;3、初始化索引文件夹4、配置设置5、定…...

Java 根据字符生成背景透明的图片

上代码 package com.example.demotest.controller;/*** Author shaolin* Date 2024-10-08 10:11**/import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; impor…...

树莓派3b安装ubuntu18.04服务器系统server配置网线连接

下载ubuntu镜像网址 img镜像&#xff0c;即树莓派官方烧录器使用的镜像网址 ubuntu18.04-server&#xff1a;ARM/RaspberryPi - Ubuntu Wiki 其他版本&#xff1a;Index of /ubuntu/releases 下载后解压即可。 发现使用官方烧录器烧录配置时配置wifi无论如何都不能使用&am…...

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…...

从零开始构建:Python自定义脚本自动化你的日常任务

从零开始构建&#xff1a;Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言&#xff0c;被广泛应用于各种自动化任务中。通过编写 Python 脚本&#xff0c;你可以轻松地将日常重复性工作自动化&#xff0c;例如文件操作、数据处理、网络爬虫、系统…...

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…...

HCIP——网络类型及数据链路层协议

目录 网络类型的分类 数据链路层协议 MA网络 以太网协议 P2P网络 HDLC---高级数据链路控制协议 HDLC网络搭建 PPP---点到点协议 PPP协议的优点 PPP数据帧封装结构​编辑 PPP会话的搭建 路建立阶段---LCP建立 认证阶段 PAP CHAP 网络层协议协商阶段---NCP协商 网…...

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表&#xff0c;栈内数据遵循先进后出(LIFO)的原则&#xff0c;对于栈&#xff0c;只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的&#xff0c;如图示&#xff1a; 对于栈这种数据类型&#xff0c;我们可以采用链表或…...

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…...

医院管理新境界:Spring Boot技术突破

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…...

Docker 环境下 MinIO 监控实战:通过 Prometheus 实现集群与桶级别性能监控

Docker 环境下 MinIO 监控实战&#xff1a;通过 Prometheus 实现集群与桶级别性能监控 文章目录 Docker 环境下 MinIO 监控实战&#xff1a;通过 Prometheus 实现集群与桶级别性能监控一 获取 prometheus 配置二 配置的内容三 prometheus 的配置1&#xff09;集群级别的指标2&a…...

渗透测试入门学习——使用python脚本自动跟踪csrf_token实现对网站登录界面的暴力破解

目录 写在前面 使用方法 相关代码 写在前面 最近在学习使用Burp Suite时发现其intruder模块无法实现多种模式的混合使用&#xff0c;就如想要暴力破解账号和口令两个区域并同时跟踪网页的csrf_token时BP似乎不能很方便的实现这一功能&#xff0c;于是自己在练习时就想到了用…...

stc8最小系统使用usb下载程序,关于断电的避坑

首先&#xff0c;按stc官方的原理图做好最小系统。 下面&#xff0c;来看一下stc手册中的操作步骤 USB-ISP 下载程序步骤&#xff1a; 1、按下板子上的 P3.2/INT0 按键&#xff0c;就是 P3.2 接地 2、给目标芯片重新上电&#xff0c;不管之前是否已通电。 电子开关是按下停电后…...

API 数据接口:使用操作流程与安全指南

在当今数字化高速发展的时代&#xff0c;API 数据接口如同构建数字世界的关键纽带&#xff0c;将不同的软件系统和服务紧密连接在一起。无论是企业开发者致力于提升业务效率&#xff0c;还是个人用户追求更便捷的数字体验&#xff0c;深入了解 API 数据接口的使用操作流程以及全…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...