第一讲: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 非常简单。
-
打开终端(Terminal)。
-
确保你已经安装了 Homebrew。如果没有安装,可以使用以下命令进行安装:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
使用 Homebrew 安装 Go:
brew install go安装完成后,Go 的执行文件和相关工具将会被安装到
/usr/local/bin/中,默认版本是最新稳定版。
手动下载安装 Go
如果你不使用 Homebrew,也可以手动从官网下载安装:
- 访问 Go 官方下载页面。
- 下载适用于 macOS 的安装包(通常是
.pkg文件)。 - 下载完成后,双击安装包并按照提示进行安装。
安装成功后,Go 会被安装到 /usr/local/go 目录。
配置环境变量
Go 的安装目录 /usr/local/go 包含了 Go 的所有工具和命令行工具。为了让系统知道 Go 的位置,我们需要配置 Go 的 GOPATH 和 GOROOT 环境变量。
配置环境变量
-
打开终端,编辑你的
~/.zshrc文件(macOS 默认使用 Zsh,或者你使用的是 Bash 则编辑~/.bash_profile):nano ~/.zshrc -
在文件末尾添加以下内容:
# Go 环境变量配置 export GOPATH=$HOME/go export PATH=$PATH:/usr/local/go/bin:$GOPATH/binGOPATH:这是 Go 的工作区目录,存储你的 Go 项目和依赖。默认建议使用~/go目录。PATH:将 Go 的二进制文件添加到PATH中,确保你可以在任何地方使用 Go 的命令。
-
保存文件并退出(按
Ctrl + O保存,按Ctrl + X退出)。 -
运行以下命令使配置立即生效:
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 中的条件表达式使用 if 和 else,条件表达式不需要用括号包裹。
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,没有 while 和 do-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、体脂率、建议
- 总人数、平均体脂率
运用到的知识:
- 变量和常量:
- 声明和使用变量来存储用户输入的身高、体重、年龄等信息。
- 使用
:=进行简短声明,比如a := 10。
- 输入和输出:
- 使用
fmt.Scanln来获取用户输入,并使用fmt.Println输出结果。
- 使用
- 条件表达式:
- 使用
if语句来判断体脂率的不同范围,并给出不同的健康建议。
- 使用
- 循环:
- 使用
for循环来处理多个人的输入和体脂计算。
- 使用
- 函数:
- 编写了多个函数,如
calculateBMI、calculateBodyFatRate和giveSuggestion,这些函数帮助简化代码结构并实现代码复用。
- 编写了多个函数,如
- 数组和切片:
- 使用了数组来存储每个人的信息,如身高、体重、年龄等。
- 切片可以方便地处理可变大小的数据集合。
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)
}
说明:
-
数组存储:
- 使用
names、genders、heights、weights、ages、BMIs和bodyFatRates这几个数组分别存储每个人的信息。 - 每个数组的长度为3,适用于存储三个人的数据。
- 使用
-
函数封装:
calculateBMI:根据身高和体重计算 BMI。calculateBodyFatRate:根据性别、BMI 和年龄计算体脂率。giveSuggestion:根据体脂率给出建议。calculateAndPrintAverageBodyFatRate:计算并输出平均体脂率。
-
示例输入/输出:
请输入第 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:判断两条线是否平行
编写一个程序来判断两条直线是否平行。你需要通过两点计算每条线的斜率,并比较两条线的斜率是否相等,来确定它们是否平行。
运用到的知识:
-
变量:
- 使用
var和:=声明变量,存储用户输入的点坐标。
- 使用
-
输入和输出:
- 使用
fmt.Scanln获取用户输入,并用fmt.Println输出结果。
- 使用
-
条件表达式:
- 使用
if语句来判断两条线是否垂直(即 x 坐标相同),如果两条线都垂直,它们就是平行的。
- 使用
-
函数:
- 使用了函数
calculateSlope来计算斜率,areLinesParallel来判断两条线是否平行,这些函数让代码结构更加清晰。
- 使用了函数
通过比较两条线的斜率来判断它们是否平行。两点决定一条直线,斜率的公式为: 斜率 = y 2 − y 1 x 2 − x 1 \text{斜率} = \frac{y_2 - y_1}{x_2 - x_1} 斜率=x2−x1y2−y1。如果两条线的斜率相同,那么它们就是平行的。需要注意的是,当两点的 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("这两条线不平行")}
}
说明:
calculateSlope:计算给定两点间的斜率,如果两点的x坐标相同,返回false表示垂直线。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 是否正确安装 验证安装:编写第一个 Go 程序创建 Go 工作区编写 Hello World 程序运行程序编译程序 常用的 Go 命令 Go语言基础语法1. 变量…...
Linux CentOS stream9配置本地yum源
在Linux系统中,yum源配置是一个重要的环节。把系统安装时配置的国外yum源转换为国内yum源,能够帮助系统快速安装软件包。对于网络环境不稳定或无法联网的系统,配置本地yum源,可以让用户在离线状态下也能进行软件包的安装,十分重要。 一、国内源 在使用Linux的日常工作中…...
std::string
std::string是C标准库中的一个基本类模板,专门用于处理字符串。它提供了一个可变长度的字符序列,以及一系列用于字符串操作的方法。std::string是值类型,这意味着当它作为函数参数传递或赋值时,整个字符串数据会被复制。 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的垃圾收集器(Garbage Collector, GC)负责自动管理内存,回收不再使用的对象所占用的空间。随着JVM的发展,出现了多种不同特性的垃圾收集器来适应不同的应用场景和性能需求。在Java 8中,主要有以下几种垃圾收集器&a…...
【Docker从入门到进阶】01.介绍 02.基础使用
1. 介绍 1.1. 什么是 Docker Docker 是一个开源的平台,用于开发、发布和运行应用程序。它使开发者能够以更精简的方式封装应用及其依赖,做到“打包一次,到处运行”。通过 Docker,您可以创建轻量级、可移植的容器,每个…...
GraphRAG-Local-UI - 基于 GraphRAG 支持本地的聊天UI
文章目录 一、关于 GraphRAG-Local-UI 🕸️特点🌟🗺️路线图最近更新即将推出的功能 二、📦安装和设置三、使用入门🚀1、创建索引目录2、添加示例数据(可选)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镜像,即树莓派官方烧录器使用的镜像网址 ubuntu18.04-server:ARM/RaspberryPi - Ubuntu Wiki 其他版本: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自定义脚本自动化你的日常任务
从零开始构建:Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言,被广泛应用于各种自动化任务中。通过编写 Python 脚本,你可以轻松地将日常重复性工作自动化,例如文件操作、数据处理、网络爬虫、系统…...
【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协商 网…...
数据结构——栈与队列的实现(全码)
一 栈的概念 栈是一种特殊的线性表,栈内数据遵循先进后出(LIFO)的原则,对于栈,只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的,如图示: 对于栈这种数据类型,我们可以采用链表或…...
MacOS编译和安装Poco库的方法
1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹,克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后,报错啦!!! error: RPC failed…...
医院管理新境界:Spring Boot技术突破
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...
Docker 环境下 MinIO 监控实战:通过 Prometheus 实现集群与桶级别性能监控
Docker 环境下 MinIO 监控实战:通过 Prometheus 实现集群与桶级别性能监控 文章目录 Docker 环境下 MinIO 监控实战:通过 Prometheus 实现集群与桶级别性能监控一 获取 prometheus 配置二 配置的内容三 prometheus 的配置1)集群级别的指标2&a…...
渗透测试入门学习——使用python脚本自动跟踪csrf_token实现对网站登录界面的暴力破解
目录 写在前面 使用方法 相关代码 写在前面 最近在学习使用Burp Suite时发现其intruder模块无法实现多种模式的混合使用,就如想要暴力破解账号和口令两个区域并同时跟踪网页的csrf_token时BP似乎不能很方便的实现这一功能,于是自己在练习时就想到了用…...
stc8最小系统使用usb下载程序,关于断电的避坑
首先,按stc官方的原理图做好最小系统。 下面,来看一下stc手册中的操作步骤 USB-ISP 下载程序步骤: 1、按下板子上的 P3.2/INT0 按键,就是 P3.2 接地 2、给目标芯片重新上电,不管之前是否已通电。 电子开关是按下停电后…...
API 数据接口:使用操作流程与安全指南
在当今数字化高速发展的时代,API 数据接口如同构建数字世界的关键纽带,将不同的软件系统和服务紧密连接在一起。无论是企业开发者致力于提升业务效率,还是个人用户追求更便捷的数字体验,深入了解 API 数据接口的使用操作流程以及全…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
