Golang学习笔记


数组和切片有什么区别?

数组适合用于需要固定长度、且不需要动态变化的集合。切片更灵活,适用于需要动态变化大小的集合,并且可以方便地引用和操作部分数据。二者区别:

特性数组(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")

Gin

声明:Hack All Sec的博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Golang学习笔记


Hacker perspective for security