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的特点包括易于使用和良好的性能。

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
优点是简单好用,缺点是图标像素不能太大,太大会有锯齿,不太美观,且不支持ico文件。

还可以使用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即可。优点是支持ico,缺点是大图标也会产生锯齿,不太美观。

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

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


Hacker perspective for security