数组和切片有什么区别?
数组适合用于需要固定长度、且不需要动态变化的集合。切片更灵活,适用于需要动态变化大小的集合,并且可以方便地引用和操作部分数据。二者区别:
特性 | 数组(Array) | 切片(Slice) |
---|---|---|
长度 | 固定,声明时必须指定 | 动态,可根据需要调整 |
类型 | [N]Type,其中 N 是长度 | []Type,不包含长度 |
内存分配 | 在编译时确定,连续内存块 | 基于数组实现,包含指针、长度和容量 |
传递方式 | 值传递,拷贝整个数组 | 引用传递,传递底层数组的引用 |
切片操作 | 不支持 | 支持,可以获取子切片 |
使用场景 | 需要固定大小的集合 | 需要动态调整大小的集合,或高效传递大数据量的集合 |
内置函数支持 | 不支持 append 等内置函数 | 支持 append、copy 等内置函数 |
关于Windows下使用cgo交叉编译linux程序
可参考:
Windows golang cgo交叉编译 linux arm64
Windows golang cgo交叉编译 linux x86_64
图形化界面选择
在Golang的GUI框架选择上,有几个值得推荐的框架:
- Fyne:Fyne是一个跨平台的GUI库,支持Windows、macOS、Linux和移动端平台。它以简单易用、快速开发和跨平台为主要特点,提供了易于使用的API和可视化构建工具,同时支持许多UI组件和布局选项。
- Walk:Walk是专门为Windows平台设计的GUI库,它提供了大量的UI控件和布局选项。Walk采用Go的语言风格和结构体设计方式,使得开发者可以快速地创建复杂的窗口应用程序。它的优点在于完整性强、功能齐全、灵活性高。
- gotk3:gotk3是Golang的GTK+3封装库,提供了完整的GTK+3 API支持。GTK+3是一个跨平台的GUI工具包,在Linux上得到广泛应用。使用gotk3可以在Golang中轻松创建GTK+3应用程序,其优点在于功能齐全、稳定性好。
- GOVCL:GOVCL是另一个跨平台的GUI包,它提供了与Windows VCL库相似的功能,适用于构建Windows应用程序界面。GOVCL结合了Golang的高效性能和VCL的丰富控件,适合需要开发Windows特定界面的项目。
- Gio UI:Gio UI支持多个操作系统,包括Windows、macOS、iOS和Linux,它提供了与Gio库的集成,适合开发跨平台应用程序。Gio UI的特点包括易于使用和良好的性能。
- Electron + Vue + Golang
Header.Set和Header.Add的区别
user,pass := "test","test"
url := "https://www.hackall.cn"
data := fmt.Sprintf(`username=%s&password=%s`,user,pass)
req, err := http.NewRequest("POST",url,strings.NewReader(data))
if err != nil {
fmt.Println(err.Error())
}
req.Header.Add("Cookie","username=test")
req.Header.Set("client-version","1.5.0")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
Add和Set是http.Header类型提供的两个不同的方法,它们用于操作请求头,但行为有所不同:
- Add方法用于添加请求头字段。如果字段已存在,Add会追加新的值到现有的字段值列表中,而不是替换它们。
- Set方法用于设置请求头字段。无论该字段是否已存在,Set都会替换现有的字段值为新值。
打包带图标和详情的程序
Windows
可以使用go-winres。也可以使用MingGW的windres。
- go-winres的优点是简单好用,缺点是图标像素不能太大,太大会有锯齿,不太美观,且不支持ico文件。
- MingGW的优点是支持ico,缺点是大图标也会产生锯齿,不太美观。
使用go-winres
首先,安装go-winres
:
go install github.com/tc-hib/go-winres@latest
然后在程序根目录下进行初始化:
go-winres init
此时会生成winres
目录,进入目录后会有默认图标,和一个winres.json
文件,将你的png图标文件放在此处,然后编辑winres.json
文件:
{
"RT_GROUP_ICON": {
"APP": {
"0000": [
"logo.png" // 图标,像素不能超过256 x 256,实测32 x 32像素大小不错,否则有锯齿
]
}
},
"RT_MANIFEST": {
"#1": {
"0409": {
"identity": {
"name": "程序名称",
"version": "1.0.0"
},
"description": "测试程序",
"minimum-os": "win7", //最低要求操作系统,可以是vista、win7、win8、win8.1、win10
"execution-level": "as invoker", //应用程序所需的权限,可以是as invoker(无需任何权限),highest(当前用户的可用最高权限),administrator(强制要求管理员权限)
"ui-access": false,
"auto-elevate": false,
"dpi-awareness": "system",
"disable-theming": false,
"disable-window-filtering": false,
"high-resolution-scrolling-aware": false,
"ultra-high-resolution-scrolling-aware": false,
"long-path-aware": false,
"printer-driver-isolation": false,
"gdi-scaling": false,
"segment-heap": false,
"use-common-controls-v6": false
}
}
},
"RT_VERSION": {
"#1": {
"0000": {
"fixed": {
"file_version": "1.0.0.0",
"product_version": "1.0.0.0"
},
"info": {
"0409": { //语言代码,0409表示英语
"Comments": "",
"CompanyName": "公司名称",
"FileDescription": "文件描述",
"FileVersion": "文件版本",
"InternalName": "",
"LegalCopyright": "版权信息",
"LegalTrademarks": "",
"OriginalFilename": "原始程序名",
"PrivateBuild": "",
"ProductName": "产品名称",
"ProductVersion": "产品版本",
"SpecialBuild": ""
}
}
}
}
}
}
然后执行go-winres.exe make
生成syso
文件。
然后正常执行构建命令如go build -ldflags "-w -s"
即可生成带图标和属性的程序。
使用MingGW
使用MingGW的windres。需要的环境和资源:
- MingGW
- Go
- rc文件
- ico文件
rc文件内容如下:
1 VERSIONINFO
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEOS 0x40004
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "040904B0"
{
VALUE "CompanyName", "HackAllSec"
VALUE "FileDescription", "Test"
VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", ""
VALUE "LegalCopyright", "Copyright (C)2024 www.hackall.cn. All rights reserved."
VALUE "OriginalFilename", ""
VALUE "ProductName", "TEST"
VALUE "ProductVersion", "1.0.0.0"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0X0409, 0X04B0
}
}
IDI_ICON1 ICON "icon.ico"
内容说明请参考微软文档:StringFileInfo BLOCK 语句
然后生成syso
文件:
windres -o demo.syso demo.rc
然后正常build即可。
Json解析库
- 标准库
encoding/json
:这是 Go 语言官方提供的 JSON 处理库,它使用反射来自动处理 JSON 和 Go 数据结构的映射。它易于使用,文档齐全,但性能相对较差,尤其是在处理大型或复杂 JSON 数据时。它适合对性能要求不高的场景,并且当开发者需要快速实现 JSON 编码和解码功能时,它是一个很好的选择。 valyala/fastjson
:这个库以其高性能而闻名,声称比标准库快 15 倍。它通过避免使用反射,并且只解析 JSON 中请求的部分,从而实现快速解析。它的 API 简单,但功能比较基础,不支持复杂的 JSON 到结构体的映射,适合需要处理大量 JSON 数据且对性能有较高要求的场景。tidwall/gjson
:GJSON 提供了灵活的查询功能,支持使用点分路径或通配符来检索 JSON 数据。它的性能虽然不如 fastjson,但功能完善,支持复杂的查询和多种数据类型的检索。适合需要复杂查询功能和一定性能保证的业务场景。buger/jsonparser
:这个库注重性能,同时提供了方便的 API 设计,允许用户通过回调函数实现个性化需求。它通过减少递归使用、避免反射以及优化内存分配来提高性能。适合需要高性能和一定灵活性的 JSON 解析任务。json-iterator
:虽然未在搜索结果中详细描述,但 json-iterator 是另一个高性能的库,它提供了与标准库类似的 API,但在性能上有所提升。它的性能与标准库相差不大,可能在某些情况下不比标准库更优。easyjson
:这个库通过为每个结构体生成序列化代码来实现高性能,类似于 Protocol Buffers 的做法。它具有侵入性,因为需要为每个要序列化的结构体添加特定的注释。适合对性能有极高要求且不排斥代码生成方式的开发者。
fastjson
安装:go get -u github.com/valyala/fastjson
解析 JSON:
使用 fastjson 解析 JSON 数据,创建一个 Parser
对象,然后使用 Parse 方法解析 JSON 字符串:
var p fastjson.Parser
v, err := p.Parse(jsonBytes)
if err != nil {
// 处理错误
}
获取数据:
一旦 JSON 数据被解析为 fastjson.Value
对象,您可以使用 Get 方法获取 JSON 中的值:
age := v.GetInt("age")
name := v.GetString("name")
设置数据:
您可以使用 Set 方法修改 JSON 对象中的值:
v.Set("name", "John")
Comments | NOTHING