Go:入门
文章目录
- Hello, World
- 命令行参数
- 找出重复行
- GIF动画
- 获取一个URL
- 并发获取多个URL
- 一个 Web 服务器
- 其他
Hello, World
Hello world
package main
import "fmt"
func main() {fmt.Println("Hello, 世界")
}
package main
表明这是一个可独立执行的程序包;import "fmt"
导入标准库中的fmt
包,用于格式化输入输出 ;main
函数是程序的入口,fmt.Println
函数输出 “Hello, 世界”。
程序运行
go run
命令:$ go run helloworld.go
可直接编译、链接并运行.go
源文件,输出 “Hello, 世界” 。go build
命令:$ go build helloworld.go
将生成名为helloworld
的二进制程序,之后执行$./helloworld
也能输出 “Hello, 世界” ,适用于创建可复用程序。
语言特性
-
Unicode 支持:Go 原生支持 Unicode,能处理各国语言。
-
包与导入:Go 代码通过包组织,
package
声明文件所属包,import
导入其他包。main
包用于定义独立可执行程序,main
函数是程序执行起点。导入包需精确,缺失或多余导入会致编译失败,import
声明要在package
声明之后 。 -
函数声明:由
func
关键字、函数名、参数列表、返回值列表(可空)和函数体组成。 -
语法格式:Go 语言语句或声明后一般不用分号结尾(特殊情况除外);对代码格式化要求严格,可使用
gofmt
工具格式化代码,goimports
工具可按需管理导入声明。 还提到可通过go get
命令获取goimports
工具,多数 Go 操作可通过go
工具实现。
命令行参数
程序常需处理输入产生输出,输入源多样,命令行参数是常见输入源之一 。Go 通过os
包中的os.Args
获取命令行参数,os.Args
是字符串切片(slice) 。os.Args[0]
是命令本身名字,os.Args[1:]
是程序执行时传入参数 。
echo
package mainimport ("fmt""os""strings"
)// echo1
func main() {var s, sep stringfor i := 1; i < len(os.Args); i++ {s += sep + os.Args[i];sep = " ";}fmt.Println(s);
}
-
导入
fmt
和os
包,在main
函数中,通过for
循环遍历os.Args[1:]
,使用+=
操作符将参数追加到字符串s
中,参数间用空格分隔,最后通过fmt.Println
输出所有参数 。 -
Go 语言中变量声明(
var s, sep string
)、操作符(+=
)以及for
循环语法 。 -
for
循环有多种形式,for initialization; condition; post
,初始化、条件判断和后置操作部分可省略,可实现无限循环等 。
// echo2
func main() {s, sep := "", ""for _, arg := range os.Args[1:] {s += sep + arg;sep = " ";}fmt.Println(s);
}
-
利用
range
关键字遍历os.Args[1:]
,range
会返回索引和对应元素值。当不需要索引时,可使用空白标识符_
。 -
短变量声明(如
s, sep := "", ""
)以及等价的变量声明方式 。
// echo3
func main() {fmt.Println(strings.Join(os.Args[1:], " "));
}
- 使用
strings.Join
函数,传入os.Args[1:]
和分隔符" "
,可将命令行参数以指定分隔符连接成字符串输出,更为简洁高效 。
找出重复行
// dup1
func main() {counts := make(map[string]int)input := bufio.NewScanner(os.Stdin)for input.Scan() {counts[input.Text()]++}for line, n := range counts {if n > 1 {fmt.Printf("%d\t%s\n", n, line)}}
}
- 功能:输出标准输入中出现次数大于 1 的行,前面是出现次数 。
- 实现:
- 导入
bufio
、fmt
、os
包 。在main
函数中,用make
函数创建map[string]int
类型的counts
,用于统计每行出现次数。 - 通过
bufio.NewScanner(os.Stdin)
创建扫描器input
读取标准输入,for input.Scan()
循环逐行读取,counts[input.Text()]++
统计每行出现次数。 - 再通过
for line, n := range counts
遍历counts
,用if n > 1
判断,若出现次数大于 1,使用fmt.Printf("%d\t%s\n", n, line)
格式化输出次数和行内容 。
- 导入
- 相关知识:介绍了
if
语句语法(条件部分不放在圆括号,程序体用大括号 );map
数据结构(存储键值对,make
新建,键类型任意可比较,值任意类型 );bufio.Scanner
扫描器读取输入 ;fmt.Printf
格式化输出(介绍常用占位符如%d
、%s
等 ) 。
// dup2
func main() {counts := make(map[string]int)files := os.Args[1:];if len(files) == 0 {countsLines(os.Stdin, counts)} else {for _, arg := range files {f, err := os.Open(arg)if err != nil {fmt.Fprintf(os.Stderr, "dup2: %v\n", err)continue}countsLines(f, counts)f.Close()}}for line, n := range counts {if n > 1 {fmt.Printf("%d\t%s\n", n, line)}}
}func countsLines(f* os.File, counts map[string]int) {input := bufio.NewScanner(f)for input.Scan() {counts[input.Text()]++}
}
- 功能:可从标准输入或指定文件列表读取,打印输入中多次出现的行的个数和文本 。
- 实现:
- 同样导入相关包,创建
counts
统计次数 。先判断命令行参数os.Args[1:]
,若为空,直接统计标准输入countLines(os.Stdin, counts)
。 - 若有参数,遍历参数列表,用
os.Open
打开文件,若打开失败用fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
输出错误信息并continue
继续下一个文件 。打开成功则调用countLines(f, counts)
统计行数,最后关闭文件f.Close()
。countLines
函数逻辑和dup1
类似,通过扫描器逐行读取统计 。
- 同样导入相关包,创建
- 相关知识:介绍
os.Open
返回文件指针和错误值,文件读取完需Close
释放资源;简单错误处理方式 ;函数声明顺序可任意 ;map
作为引用类型,函数中对其修改在调用处可见 。
// dup3
func main() {counts := make(map[string]int)for _, filename := range os.Args[1:] {data, err := ioutil.ReadFile(filename)if err != nil {fmt.Fprintf(os.Stderr, "dup3: %v\n", err)continue}for _, line := range strings.Split(string(data), "\n") {counts[line]++}}for line, n := range counts {if n > 1 {fmt.Printf("%d\t%s\n", n, line)}}
}
- 功能:从指定文件读取,统计重复行 。
- 实现:导包,遍历命令行参数
os.Args[1:]
,用ioutil.ReadFile
读取文件内容到data
,若失败输出错误信息并continue
。成功读取后,用strings.Split(string(data), "\n")
按行分割内容,再遍历分割后的行统计次数并输出重复行 。 - 相关知识:
ioutil.ReadFile
读取文件内容为字节切片,可转换为字符串;strings.Split
分割字符串 。
GIF动画
var palette = []color.Color{color.White, color.Black}const (whiteIndex = 0blackIndex = 1
)func main() {rand.Seed(time.Now().UTC().UnixNano()) if len(os.Args) > 1 && os.Args[1] == "web" {handler := func (w http.ResponseWriter, r *http.Request) {lissajous(w)}http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe("localhost:8000", nil))return}lissajous(os.Stdout)
}func lissajous(out io.Writer) {const (cycles = 5res = 0.001size = 100nframes = 64delay = 8)freq := rand.Float64() * 3.0anim := gif.GIF{LoopCount: nframes}phase := 0.0for i := 0; i < nframes; i++ {rect:= image.Rect(0, 0, 2*size + 1, 2*size + 1)img := image.NewPaletted(rect, palette)for t := 0.0; t < cycles*2*math.Pi; t += res {x := math.Sin(t)y := math.Sin(t*freq + phase)img.SetColorIndex(size + int(x*size + 0.5), size + int(y*size + 0.5), blackIndex)}phase += 0.1anim.Delay = append(anim.Delay, delay)anim.Image = append(anim.Image, img)}gif.EncodeAll(out, &anim)
}
- 功能:利用 Go 标准图像包创建一系列位图图像,并编码为 GIF 动画,展示利萨茹图形(参数化的二维谐振曲线,类似示波器 x 轴和 y 轴馈电输入的两个正弦波图形 )。
-
实现:
- 常量与变量声明:
- 用
var
声明palette
切片存储颜色 ,包含白色和黑色 。 - 用
const
声明whiteIndex
和blackIndex
常量,分别表示画板中白色和黑色的索引 。const
用于给编译期间值固定的量命名,可在包级别或函数内声明,常量类型为数字、字符串或布尔值 。
- 用
- 结构体与复合字面量:
gif.GIF
是结构体类型,anim
变量是该结构体实例 。通过复合字面量gif.GIF{LoopCount: nframes}
创建anim
,并后续通过点记法显式更新其Delay
和Image
字段 。复合字面量是用一系列元素值初始化 Go 复合类型的紧凑表达方式 。
- 核心函数
lissajous
:- 函数接受
io.Writer
类型的out
参数,用于输出 GIF 动画 。函数内通过一系列常量定义动画参数,如cycles
(x 振荡器变化个数 )、res
(角度分辨率 )、size
(图像画布尺寸 )、nframes
(动画帧数 )、delay
(帧间延迟 )等 。 - 生成随机的 y 振荡器相对频率
freq
,创建gif.GIF
结构体anim
并设置循环帧数 。通过两层嵌套循环,外层循环控制帧数,内层循环在每个帧内,基于正弦函数计算 x 和 y 坐标,设置图像对应坐标点颜色(白色或黑色 ),并将延迟和图像帧追加到anim
中 ,最后用gif.EncodeAll
将动画编码写入out
。
- 函数接受
main
函数:设置随机数种子,根据命令行参数判断是否作为 Web 服务运行(若参数为"web"
),若为 Web 服务则注册处理函数并启动服务;否则直接调用lissajous
函数将动画输出到标准输出 。
- 常量与变量声明:
-
使用:
go run .\main\lissajous.go web
运行代码,浏览器中访问http://localhost:8000
,就能看到生成的 Lissajous 曲线的 GIF 动画。
获取一个URL
func main() {for _, url := range os.Args[1:] {resp, err := http.Get(url)if err != nil {fmt.Fprintf(os.Stderr, "fetch: %v\n", err)os.Exit(1)}b, err := ioutil.ReadAll(resp.Body)resp.Body.Close()if err != nil {fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)os.Exit(1)}fmt.Printf("%s", b)}
}
-
功能:
fetch
程序用于获取指定 URL 返回的 HTTP 内容,并将其输出,是从互联网获取信息的示例 。 -
背景:Go 语言在
net
包下提供系列工具处理网络信息,利用这些工具可通过互联网收发信息、创建服务器等,其并发特性在网络应用场景很有用 。 -
实现:
-
通过
for _, url := range os.Args[1:]
遍历命令行参数中传入的 URL 。 -
对每个 URL,使用
http.Get(url)
发起 HTTP 请求,若请求出错,通过fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
在标准错误输出打印错误信息,然后用os.Exit(1)
以状态码 1 退出程序 。 -
若请求成功,用
ioutil.ReadAll(resp.Body)
读取响应体内容到b
,读取完成后关闭响应体resp.Body.Close()
,若读取过程出错,打印错误信息并退出 。最后用fmt.Printf("%s", b)
将获取到的内容输出到标准输出 。
-
-
使用:
go run .\main\fetch.go https://example.com
<!doctype html>
<html>
<head><title>Example Domain</title>
// 省略...
</div>
</body>
</html>
并发获取多个URL
func main() {start := time.Now()ch := make(chan string)for _, url := range os.Args[1:] {go fetch(url, ch) // 启动 goroutine}for range os.Args[1:] {fmt.Println(<-ch) // 从通道 ch 接收}fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds)
}func fetch(url string, ch chan<- string) {start := time.Now()resp, err := http.Get(url)if err != nil {ch <- fmt.Sprint(err)return}nbytes, err := io.Copy(ioutil.Discard, resp.Body)resp.Body.Close()if err != nil {ch <- fmt.Sprintf("while reading %s: %v", url, err)return}secs := time.Since(start).Seconds()ch <- fmt.Sprintf("%.2fs %7d %s", secs, nbytes, url)
}
-
功能:
fetchall
程序并发获取多个 URL 的内容,报告每个响应的大小和花费时间,不处理响应具体内容 。 -
背景:Go 语言支持并发编程,
fetchall
程序简单展示了 Go 的并发机制—goroutine 和通道(channel) 。 -
main
函数逻辑:- 记录开始时间
start := time.Now()
,创建字符串通道ch := make(chan string)
。 - 通过
for _, url := range os.Args[1:]
遍历命令行参数中的 URL ,对每个 URL 使用go fetch(url, ch)
启动一个 goroutine 来处理 。 - 再通过
for range os.Args[1:]
循环从通道ch
接收信息并打印 ,最后打印总耗时fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
。
- 记录开始时间
-
fetch
函数逻辑:- 记录每个 URL 请求开始时间
start := time.Now()
,使用http.Get(url)
发起 HTTP 请求 ,若出错将错误信息通过ch <- fmt.Sprint(err)
发送到通道 。 - 若请求成功,用
io.Copy(ioutil.Discard, resp.Body)
丢弃响应内容(获取字节数 ),关闭响应体resp.Body.Close()
,若读取过程出错也将错误信息发送到通道 。 - 计算请求耗时
secs := time.Since(start).Seconds()
,将耗时、字节数、URL 信息通过ch <- fmt.Sprintf("%.2fs %7d %s", secs, nbytes, url)
发送到通道 。
- 记录每个 URL 请求开始时间
-
并发机制原理:
-
goroutine:是一种并发执行的函数,
main
函数在一个 goroutine 中执行,go
语句创建额外的 goroutine ,可异步执行任务 。 -
通道(channel):用于在 goroutine 之间传递指定类型的值 ,起到同步和通信作用 。
fetch
函数向通道发送信息,main
函数从通道接收并处理信息,避免多个 goroutine 输出交织 。
-
-
使用:
go run .\main\fetchall.go https://baidu.com https://bilibili.com https://example.com
0.32s 1374 https://bilibili.com
0.47s 2381 https://baidu.com
0.74s 1256 https://example.com
%!f(func() float64=0x7e9900)s elapsed
一个 Web 服务器
// server1
func main() {http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe("localhost:8000", nil))
}func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}
- 功能:创建一个迷你 Web 服务器,返回客户端请求 URL 的路径部分 。
// server2
var mu sync.Mutex
var count intfunc main() {http.HandleFunc("/", handler)http.HandleFunc("/count", counter)log.Fatal(http.ListenAndServe("localhost:8000", nil))
}func handler(w http.ResponseWriter, r *http.Request) {mu.Lock()count++mu.Unlock()fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}func counter(w http.ResponseWriter, r *http.Request) {mu.Lock()fmt.Fprintf(w, "Count %d\n", count)mu.Unlock()
}
- 功能:在
server1
基础上扩展,除返回 URL 路径外,对特定的/count
请求,返回当前为止请求的数量 。 handler
函数:在处理请求时,先加锁mu.Lock()
,计数count++
,解锁mu.Unlock()
,再返回 URL 路径 ;counter
函数加锁后,通过fmt.Fprintf(w, "Count %d\n", count)
返回请求计数 ,然后解锁 。引入互斥锁是为防止并发请求时计数变量count
的竞争问题 。
func main() {http.HandleFunc("/", handler)log.Fatal(http.ListenAndServe("localhost:8000", nil))
}func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "%s %s %s\n", r.Method, r.URL, r.Proto)for k, v := range r.Header {fmt.Fprintf(w, "Header[%q] = %q\n", k, v)}fmt.Fprintf(w, "Host = %q\n", r.Host)fmt.Fprintf(w, "RemoteAddr = %q\n", r.RemoteAddr)if err := r.ParseForm(); err != nil {log.Print(err)}for k, v := range r.Form {fmt.Fprintf(w, "Form[%q] = %q\n", k, v)}
}
-
功能:处理程序回显 HTTP 请求,包括请求方法、URL、协议,以及请求头和表单数据等信息 。
-
使用:
go run .\main\server.go
运行代码,浏览器中访问http://localhost:8000
,就能对应的HTTP请求。
其他
switch coinflip() {
case "heads":heads++
case "tails":tails++;
default:fmt.Println("landed on edge!")
}switch {
case x > 0:return +1
default:return 0
case x < 0return -1
}
-
switch
语句:是多路分支控制语句。switch coinflip()
根据coinflip
函数返回值与case
条件值比较,执行第一个匹配的case
语句块,若都不匹配则执行default
语句块 。switch
语句无需操作数,可像布尔表达式列表,还有无标签(tagless)选择形式switch { }
。switch
可包含初始语句,如变量声明、递增赋值或函数调用等 。同时break
和continue
可改变控制流,break
用于中断for
、switch
或select
最内层,continue
让for
内层循环开始新迭代 ,还有goto
语句,但一般不建议使用 。
-
命名类型:用
type
声明为已有类型命名,如定义2D
图形系统的Point
类型type Point struct { X, Y int }
,可通过var p Point
声明该类型变量 ,类型声明和命名 。 -
指针:Go 语言提供指针,
&
操作符获取变量地址,*
操作符获取指针引用变量的值,但指针不支持算术运算 。 -
方法:关联命名类型的函数,Go 中方法可关联几乎所有命名类型 。
-
接口:用于处理不同具体类型的抽象类型,基于类型包含的方法定义 。
-
包:Go 有可扩展实用的标准库,社区也有众多共享库。编程时优先使用现有包,可在
https://golang.org/pkg
查找标准库索引,https://godoc.org
找社区包,通过go doc
工具可查看包文档 ,如$ go doc http.ListenAndServe
。 -
注释:在函数声明前写注释说明行为是好风格,可被
go doc
和godoc
工具识别展示 。多行注释可用类似/*...*/
形式,注释内//
和/*
无特殊含义,且注释不能嵌套 。
Y int } ,可通过
var p Point`声明该类型变量 ,类型声明和命名 。
-
指针:Go 语言提供指针,
&
操作符获取变量地址,*
操作符获取指针引用变量的值,但指针不支持算术运算 。 -
方法:关联命名类型的函数,Go 中方法可关联几乎所有命名类型 。
-
接口:用于处理不同具体类型的抽象类型,基于类型包含的方法定义 。
-
包:Go 有可扩展实用的标准库,社区也有众多共享库。编程时优先使用现有包,可在
https://golang.org/pkg
查找标准库索引,https://godoc.org
找社区包,通过go doc
工具可查看包文档 ,如$ go doc http.ListenAndServe
。 -
注释:在函数声明前写注释说明行为是好风格,可被
go doc
和godoc
工具识别展示 。多行注释可用类似/*...*/
形式,注释内//
和/*
无特殊含义,且注释不能嵌套 。
参考资料:《Go程序设计语言》
相关文章:
Go:入门
文章目录 Hello, World命令行参数找出重复行GIF动画获取一个URL并发获取多个URL一个 Web 服务器其他 Hello, World Hello world package main import "fmt" func main() {fmt.Println("Hello, 世界") }package main表明这是一个可独立执行的程序包&#…...
深入理解 ResponseBodyAdvice 及其应用
ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口,允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…...
SpringBoot对接火山引擎大模型api实现图片识别与分析
文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上,在上一篇博客,我们已经实现了spring ai对接本地大模型实现了聊天机器人,但是目前有个新…...
Java ---成员,局部变量与就近原则
成员变量 声明在类内部,但在方法、构造器或代码块之外的变量。 属于类的实例(对象)或类本身(静态变量)。 实例变量(非静态成员变量): public class Person {private String name…...
基于libevent写一个服务器(附带源码)
使用libevent搭建服务器 服务器源码二级目录 使用开源框架,目的是减少程序员对一些精细的操作的误操作,也是为了让程序员能更好的对接业务而不是底层api的使用。 为何使用libevent,因为libevent开源已经有十几年了,能很好的承受数…...
2.2.3 Spark Standalone集群
搭建Spark Standalone集群需要完成多个步骤。首先,配置主机名、IP地址映射、关闭防火墙和SeLinux,并设置免密登录。接着,配置JDK和Hadoop环境,并在所有节点上分发配置。然后,下载并安装Spark,配置环境变量和…...
每天记录一道Java面试题---day38
说说类加载器双亲委派模型 回答重点 AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器是BootStrapClassLoader。JVM在加载一个类时,会调用AppClassLoader的laodClass方法来加载这个类,不过在这个方法中,会先…...
[ctfshow web入门] web33
信息收集 相较于上一题,这题多了双引号的过滤。我猜测这一题的主要目的可能是为了不让使用$_GET[a]之类的语句,但是$_GET[a]也是一样的 没有括号可以使用include,没有引号可以使用$_GET 可以参考[ctfshow web入门] web32,其中的所…...
【时时三省】(C语言基础)用switch语句实现多分支选择结构
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(85分以上为A等,70 ~ 84分为B等,60 ~ 69分为C等)&…...
为您的 Web 应用选择最佳文档阅读器
为显示选择合适的文档查看器是开发 Web 应用过程中至关重要的一步。文档查看器应能在提供功能性的同时,确保用户体验的流畅性。 开发人员必须评估多种因素,以确保效率、性能和兼容性。本文将帮助您了解影响用户文档浏览体验成功与否的关键指标。 渲染质…...
js逆向入门图灵爬虫练习平台第六题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNi8 观察可以发现请求头有有字段加密和响应结果加密 查看启动器 开始断点调试 直接复制里面的js内容,测试函数...
招商蛇口 | 回归生活本身,革新CID的143㎡改善标准
时光流转,城市向前。在西安这片千年文脉的沃土之上,招商蛇口已深耕11载,用21座标杆作品,为17000余户家庭筑就理想栖居。从曲江到高新,从城市更新到人居焕新,每一座作品都是对“美好生活承载者”使命的践行。…...
第6课:分布式多智能体系统架构
分布式多智能体系统架构:从算力协同到微服务部署的工程化实践 一、引言:当智能体规模突破百级:分布式架构为何成为必选项? 在多智能体系统(MAS)从“实验室Demo”走向“工业级应用”的过程中,传…...
Vue3 Teleport 深度解析与面试技巧
Vue3 Teleport 深度解析与面试技巧 一、Teleport 核心价值解析 1.1 诞生背景与设计哲学 DOM层级困境:传统组件树与视觉层级的矛盾样式污染问题:z-index层级管理的世纪难题逻辑解耦需求:业务逻辑与DOM结构的正交性要求 1.2 核心能力矩阵 能…...
断言与反射——以golang为例
断言 x.(T) 检查x的动态类型是否是T,其中x必须是接口值。 简单使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二个参数就是OK,这…...
react函数组件中,className字符串、style对象如何在父子组件之间传递
一、需要传递的样式在父组件的scss文件中提前写好 子组件的dom解析后: 二、向子组件直接传递style对象...
WHAT - React Portal 机制:将子组件渲染到 DOM 的指定节点
文章目录 适合场景基本语法示例:Modal 弹窗1. 创建一个简单的 Modal.tsx2. 在 App 中使用 为什么要用 Portal?TypeScript 中 Portal 类型定义? 适合场景 React Portal 是 React 提供的一种机制,让你可以将子组件渲染到 DOM 的指定…...
企业绿电消纳比例不达标?安科瑞微电网智慧能源平台助力企业低碳转型
方案配置支持请联系安科瑞电气周女士 企业绿电消纳政策是国家推动能源转型和实现“双碳”目标的重要抓手,近年来政策体系逐步完善。企业通过建设“源网荷储”一体化项目、虚拟电厂等技术,提升绿电消纳能力。 一、安科瑞提供解决方案 深耕用电业务&…...
uni-app初学
文章目录 1. pages.json 页面路由2. 图标3. 全局 CSS4. 首页4.1 整体框架4.2 完整代码4.3 轮播图 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分类 uni-row、uni-col4.6 商品列表 小程序开发网址: 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下…...
网络划分vlan隔离
隔离划分 比如我们想要将pc1和pc2隔离,我们只需在lsw1交换机中,如下配置: sys 先进入系统视图 先后输入 代表创建2个隔离区 vlan 10 vlan 20 然后进入0/0/1、0/0/2设置隔离类型,并划分隔离区域 int gi0/0/01 port l…...
HDCP(四)
HDCP驱动开发实战深度解析 以下从协议栈架构、核心模块实现、安全设计到硬件集成,结合HDCP 2.x规范与主流硬件平台(如ARM、FPGA)特性,系统拆解驱动开发关键环节: 1. 协议栈架构与模块划分 驱动分层设计 硬件抽象层&…...
大数据(7.4)Kafka存算分离架构深度实践:解锁对象存储的无限潜能
目录 一、传统架构的存储困境与破局1.1 数据爆炸时代的存储挑战1.2 存算分离的核心价值矩阵 二、对象存储集成架构设计2.1 分层存储核心组件2.2 关键配置参数优化 三、深度集成实践方案3.1 冷热数据分层策略3.1.1 存储策略性能对比 3.2 跨云数据湖方案 四、企业级应用案例4.1 金…...
SLAM文献之SuMa++: Efficient LiDAR-based Semantic SLAM
SuMa是基于Surfel的SLAM算法SuMa的改进版本,通过引入语义分割信息提升动态环境下的鲁棒性和回环检测性能。以下从算法原理和公式推导两方面详细阐述: 一、SuMa算法原理 1. 基础:SuMa算法 SuMa使用Surfel(表面元素)构…...
react中通过 EventEmitter 在组件间传递状态
要在 Reply 组件中通过 statusChangeEvent 发送状态值,并在 Select 组件中接收这个状态值 status,你可以按照以下步骤实现: //Event.jsimport EventEmitter from events;export const statusChangeEvent new EventEmitter();// 工单状态切换…...
机器学习 从入门到精通 day_03
1. KNN算法-分类 1.1 样本距离判断 明可夫斯基距离:欧式距离,明可夫斯基距离的特殊情况;曼哈顿距离,明可夫斯基距离的特殊情况。 两个样本的距离公式可以通过如下公式进行计算,又称为欧式距离。 (…...
WHAT - React 两个重要的 Typescript 类型:ReactNode vs JSX.Element
文章目录 ReactNode 是什么?示例用途 JSX.Element 是什么?示例用途 ReactNode vs JSX.Element 对比使用建议其他相关类型例子总结 这两个类型 ReactNode 和 JSX.Element 在 React TypeScript 中经常出现,但它们含义不同,适用场景…...
了解 DeFi:去中心化金融的入门指南与未来展望
去中心化金融,或 DeFi,代表着全球金融体系运作方式的革命性转变。它是一个总称,指的是一个不断增长的去中心化应用程序(dapp)、协议和平台生态系统,这些生态系统构建在公共区块链网络上,无需传统…...
四旋翼无人机手动模式
无人机的手动模式(Manual Mode)是指飞手完全通过遥控器手动控制无人机的飞行姿态、高度、方向和速度,无需依赖自动稳定系统或辅助功能(如GPS定位、气压计定高、视觉避障等)。这种模式赋予操作者最大的操控自由度&a…...
航电系统之驱动系统篇
航电系统的驱动系统是航空电子系统中负责为各类电子设备、传感器、执行机构及控制模块提供稳定、可靠电能的关键部分。其核心功能在于将飞机电源系统的电能转换为适合航电设备使用的形式,确保航电系统在各种飞行条件下正常运行。以下从组成结构、工作原理、技术特点…...
《嵌入式开发实战:基于Linux串口的LED屏显系统设计与实现》
一、项目概述 本文介绍如何通过Linux系统的串口通信,驱动工业级LED显示屏实现动态数据展示。项目采用C语言开发,包含气象数据显示和实时时钟两大核心功能,涉及以下关键技术点: 串口通信协议配置 自定义数据帧封装 CRC16校验算法…...
记录一下移动端uView动态表单校验
uni-app开发uView必不可少,uView是uni-app生态专用的UI框架。 像element-ui一样uView也有自己的表单组件u-form。 对于下图这种列表数据该如何做表单校验,官方文档好像没有具体的案例,记录一下。 问题: 主要实现步骤:…...
Django项目入门二
Django项目入门二 目录 1.修改部门数据 2.新增员工数据 3.修改员工数据 4.删除员工数据 一、修改部门数据 上一篇文章, 我们只剩下修改功能没有做了, 那在这篇文章, 我们给它补上。 在做之前, 我们需要对views.py文件进行调整, 由于我们考虑到有部门信息和员工信息, 如…...
Java创建Android自用证书
在 Android 开发中,如果需要创建一个自用的证书,可以使用 Java 开发工具包(JDK)自带的 keytool 工具。 KeystoreGenerator.java import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.…...
Redis——实现消息队列
目录 前言 基于List结构模拟消息队列 基于List实现消息队列优缺点 基于PubSub(订阅者)实现消息队列 示例 基于PubSub的消息队列的优缺点 基于Stream的消息队列 STREAM类型消息队列的XREAD命令特点: 基于Stream的消息队列-消费者组 基于…...
学习51单片机Day01---做实验前置一些内容
目录 一、前面要看的: 1.下载软件 2.如何开始做? 3.基本框架: 4.如何编译运行: 5.可以运行的样子: 6.怎么生成hex: 7.滴滴放到单片机上: 二、过程中可能出现的问题(一直会更…...
pipe匿名管道实操(Linux)
管道相关函数 1 pipe 是 Unix/Linux 系统中的一个系统调用,用于创建一个匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 参数说明: pipefd[2]:一个包含两个整数的数组,用于存储管道的文件描述符: pi…...
vscode 异常关闭后无法远程连接服务器
笔记本没关机只是合上,结果第二天上班整台笔记本高度发热发烧,吓坏了。。。 强制关机后再开机,幸好能用。但是vscode连接服务器一直不对。 解决方式: 解决一:打开VS Code菜单"View"->“Command Palatt…...
Rust主流框架性能比拼: Actix vs Axum vs Rocket
本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中,我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…...
二氧化铪(HfO2)市场发展分析:从基础到前沿应用
引言:探索二氧化铪的重要性与市场潜力 在现代材料科学中,二氧化铪(HfO2)作为一种关键的高介电常数(High-k)材料,正逐渐成为半导体行业不可或缺的一部分。二氧化铪是一种白色的固体,…...
写一个简单的demo来理解数据库外键
准备工作 安装MySQL 确保已安装MySQL,并启动服务。可以通过命令行或工具(如MySQL Workbench)操作。 创建数据库 sql 复制 CREATE DATABASE school; USE school;创建父表和子表 步骤 1:创建父表(students)…...
Prompt-to-prompt image editing with cross attention control
Project Page: https://prompt-to-prompt.github.io Paper: https://arxiv.org/abs/2208.01626 Code: https://github.com/google/prompt-to-prompt 文章目录 1. Introduction2. Method2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-att…...
C++Cherno 学习笔记day18 [71]-[75] C++安全、PCH、dynamic_cast、基准测试、结构化绑定
b站Cherno的课[71]-[75] 一、现代C中的安全以及如何教授二、C的预编译头文件PCH三、C的dynamic_cast四、C的基准测试五、C的结构化绑定 一、现代C中的安全以及如何教授 安全编程,或者说C编程中,降低崩溃,内存泄露、非法访问等问题 C11&#…...
根据 PID 找到对应的 Docker 容器
引言 在日常运维与调试过程中,我们常常需要查找某个进程所属的 Docker 容器。当系统出现问题或资源异常时,根据进程的 PID 找到其所属容器可以帮助我们迅速定位问题。本文将介绍如何利用 Linux 的 cgroup 机制,以及 Docker 提供的工具来完成…...
传统项目纯前端实现导出excel之xlsx.bundle.js
传统项目纯前端实现导出excel之xlsx.js 自从vue问世后,使得前端开发更加简洁从容,极大的丰富组件样式和页面渲染效果,使得前端功能的可扩展性得到极大地加强。虽然vue的使用对于前后端分离的项目对于功能实现与扩展有了质的飞跃,但…...
大型手游 DDoS 攻击怎么防护?游戏盾 SDK 技术解剖实录
一、重灾区警报:大型手游为何成为 DDoS 靶心? 1. 血淋淋的行业数据 攻击规模暴涨:2024 年全球手游遭受 > 300Gbps 攻击次数同比激增 173%(Akamai 报告)经济杀伤链:1 小时 500Gbps 攻击可造成ÿ…...
【Harmony】状态管理(V1)
一、概述 文章目录 一、概述二、组件状态管理1、State1.1、State简介1.2、State简单示例 2、Prop2.1、Prop简介2.2、Prop底层实现原理2.3、Prop简单示例 3、Link3.1、Link简介3.2、Link底层实现原理3.3、Link简单示例 4、Provide Consume4.1、Provide Consume简介4.2、Provide …...
udev规则实例:监听usb插拔事件并做出相应
在 Linux 和 Android 系统中,USB 插拔事件的判断涉及从内核到用户空间的多层协作。以下是源码中关键判断点的梳理: 事件流程 内核层:UEvent 机制 USB 插拔事件首先由内核通过 UEvent 机制 上报。内核中的 USB 驱动(如 drivers/…...
【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化
题目来源:第十四届蓝桥杯大赛软件赛国赛C/C 大学 A 组 题目描述: 问题描述 给定一个 WH 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允…...
程序设计竞赛1
题目1 2025年春节期间,DeepSeek作为“AI界的天降紫微星”成为新晋效率神器,热度席卷全球,其团队主创成员也迅速引起了大家的关注。 DeepSeek之所以能在短时间内取得如此不凡成绩,与其团队成员的背景密不可分。团队汇聚了来自清华…...
android studio 2022打开了v1 签名但是生成的apk没有v1签名问题
我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。 apksigner verify -v app-debug.apk Verifies Verified using v1 scheme (JAR signing): false Verified usin…...