Go黑帽子(第一章)

2024-01-24 18:36
文章标签 go 第一章 帽子

本文主要是介绍Go黑帽子(第一章),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go黑帽子渗透编程之道

文章目录

    • Go黑帽子渗透编程之道
      • 1.0 第一章 GO语言基础
        • 1.1 go build 命令
        • 1.2 交叉编译
        • 1.3 golint和go vet命令
        • 1.4 指针、接口和结构体
        • 1.5 断言
        • 1.6 错误处理
        • 1.7 处理结构化数据

1.0 第一章 GO语言基础

这一章我就不详细描述了我就记录一些我觉得比较有用和比较重要的东西,每一步我都会给出详细的解释,因为这不但可以加深我个人的理解而且可以给读者一个较好的阅读体验。

注意:不懂就找ChatGPT比什么博客解答的都详细

1.1 go build 命令
go build [文件名或包路径]
常用选项:
-o:指定输出文件的名称。
-v:输出详细的构建信息。
-a:强制重新构建所有的包,而不使用缓存的对象。
-x:打印每个命令及其参数。
-work:打印临时工作目录的路径。
-ldflags:传递链接器标志。
示例用法:
基本用法:go build main.go(编译当前目录下的 main.go 文件)。
指定输出文件名:go build -o myprogram main.go(将编译结果保存为 myprogram)。
输出详细信息:go build -v main.go(显示详细的构建信息)。
强制重新构建:go build -a main.go(强制重新构建所有包)。
打印每个命令:go build -x main.go(打印每个构建命令及其参数)。
打印临时工作目录:go build -work main.go(打印临时工作目录的路径)。
传递链接器标志:go build -ldflags="-s -w" main.go(传递链接器标志,这里是去除符号和禁用 DWARF 调试信息)。
其他注意事项:
如果在目录中执行 go build,它将尝试编译包含 main 函数的文件,生成可执行文件。如果是一个库(没有 main 函数的文件),它将构建库而不是可执行文件。
在构建过程中,Go 会自动下载并安装缺失的依赖项。
默认情况下,go build 不会生成输出文件,而是将结果保存在临时目录中。如果需要自定义输出文件名,可以使用 -o 选项。

传递链接器标志:go build -ldflags="-s -w" main.go(传递链接器标志,这里是去除符号和禁用 DWARF 调试信息)。

这条指令单独提出来的目的是,这条指令可以剥离一些不必要的信息从而减少二进制文件的大小,二进制文件越小,越能使你在一些极端情况下有效地进行传输和镶嵌。//我个人觉得这个后面或者以后的测试中肯定用的上,先埋个伏笔吧,等具体用上我再来补充这部分内容。

组合命令自己去尝试有助于加深理解。


1.2 交叉编译

创建可以在不同架构上可以运行的二进制文件

前提:设置一个约束限制,目的是为了将有关要为其编译代码的操作系统和架构信息传递给build命令的一种方法。

三种方式:命令行,代码注释或文件扩展名命名约定。

命令行:

windows下的指令
$env:GOOS="linux"; $env:GOARCH="amd64"; go build hello.go$env:GOOS="windows":这一部分使用 PowerShell 的 $env: 语法设置 GOOS 环境变量为 "windows",指示 Go 编译器生成 Windows 平台可执行文件。
$env:GOARCH="amd64":同样使用 PowerShell 的 $env: 语法设置 GOARCH 环境变量为 "amd64",指示 Go 编译器生成 64 位的可执行文件

这里留下了一个疑问:

当尝试交叉编译使用本机C环境绑定的应用程序时,会遇到真的“陷阱”,如果有大佬知道可以打在评论区供大家学习使用。


1.3 golint和go vet命令

golint:

golint 是 Go 语言中一个用于检查代码风格的工具,它会检查你的 Go 代码是否符合一些常见的编码规范。以下是 golint 的基本使用方法

安装:

go get golang.org/x/lint/golint
go install golang.org/x/lint/golint

运行 golint

在你的 Go 项目目录下,执行以下命令:

golint ./...

这个命令将会在当前目录下递归检查所有 Go 源代码文件,并输出不符合规范的代码行。

如果只想检查特定的文件或目录,可以指定相应的路径:

golint path/to/your/package

go vet:

go vet 命令用于检查 Go 代码中的常见错误和潜在问题。它能够检查代码中的诸多问题,包括但不限于未使用的变量、导入路径错误、printf 格式字符串错误等。以下是一些关于 go vet 命令的基本使用方法:

基本语法:

go vet [包名]

如果没有指定包名,则 go vet 将会检查当前目录及其子目录中的所有 Go 源文件。

示例:

go vet

或者,如果你想检查特定的包,可以使用:

go vet your/package/path

检查所有标准库:

go vet std

这个命令将检查所有标准库的 Go 源代码。

忽略特定的检查: 你可以使用 -vet 标志来指定要忽略的一些检查。例如,要忽略检查未导出的名字,你可以运行:

bashCopy code
go vet -vettool=$(which vet) -vetflags=-nointerfaceexport

这个命令使用 -vettool 指定 vet 工具,-vetflags 用于传递额外的参数。

在构建时运行: 你也可以在 go buildgo install 时一并运行 go vet

go build -vet all

go install -vet all

go vet 通常用于静态代码分析,帮助你发现可能的代码问题。注意,它并不是完美的,有些问题可能仍然需要通过其他手段检查。


1.4 指针、接口和结构体

指针:

var count = int(43)ptr := &countfmt.Println(ptr)fmt.Println(*ptr)//*ptr *书上说是取消该地址的引用,我的理解就是,修改所指向地址的值用**ptr = 100fmt.Println(count)//ptr存了count的地址,然后*ptr就是修改count地址的存储的值

接口和结构体

package mainimport "fmt"type Person struct {Name stringAge  int
}type Dog struct {
}func (p *Person) SayHello() {fmt.Println("hello", p.Name)
}
func (D *Dog) SayHello() {fmt.Println("woof")
}type Friend interface {SayHello()
}func Greet(f Friend) {f.SayHello()
}
func main() {var guy = new(Person)guy.Name = "laowang"guy.SayHello()//因为guy实现了Friend里面的所有方法,所以是Friend接口类Greet(guy)var dog = new(Dog)//传递给同一个函数Greet()多种类型Greet(dog)
}

1.5 断言
package mainimport "fmt"func Foo(i interface{}) {switch v := i.(type) {case int:fmt.Println(v, "is int")case string:fmt.Println(v, "is string")default:fmt.Println("UnKnow")}
}func main() {Foo(42)Foo("laowang")
}

1.6 错误处理

Go的内置错误错误类型没有隐式包含堆栈跟踪以帮助查明错误的上下文或位置。

package mainimport ("errors""fmt"
)type error interface {Error() string
}type MyError stringfunc (e MyError) Error() string {return string(e)
}func foo() error {return errors.New("Some Error Occurred")//你把上面的返回值修改之后你会发现,errors.New()方法的的error里面的Error()方法的返回值必须是error
}func main() {if err := foo(); err != nil {//处理错误fmt.Println(err)}
}

解释:

//个人理解:这里应该是重写了error错误处理接口,自定义了一个错误处理接口。
//在Go语言中,fmt.Println 函数在输出时会调用 String() 方法,如果类型实现了 String() string 方法,那么在打印该类型的值时就会调用这个方法。由于 error 接口包含了 Error() string 方法,而在 Go 语言中 error 接口经常用于表示错误,因此当你使用 fmt.Println 打印一个实现了 error 接口的值时,实际上会调用该值的 Error() 方法。
//代码中,err 是一个实现了 error 接口的值,它是 foo() 函数返回的错误。当你使用 fmt.Println(err) 时,fmt.Println 会调用 Error() 方法来获取错误的字符串表示形式,然后将其输出到标准输出。这就是为什么你可以直接通过 fmt.Println(err) 打印出错误信息的原因。

1.7 处理结构化数据

json

package mainimport ("encoding/json""fmt"
)type Foo struct {Bar stringBaz string
}func main() {f := Foo{"Hi", "Hello"}b, _ := json.Marshal(f)//这个b打印出来就是ASCII码fmt.Println(b)fmt.Println(string(b))//使用 json.Unmarshal//函数将 JSON 格式的字节切片 b 解码为 f 对象。//json.Unmarshal 接受两个参数,第一个是 JSON 数据的字节切片,第二个是目标对象的指针。//在这里,&f 表示将解码后的数据存储到 f 对象中。json.Unmarshal(b, &f)
}

这里序列化和反序列化就不详细介绍了,这里一般会和ORM框架一起使用,ORM 框架可以根据标签来自动生成数据库表或将数据库表映射到Go语言中的结构体。

总体来说,标签是一种元编程的手段,它允许程序员为代码添加元信息,以便在运行时或通过工具进行更灵活的操作。

这篇关于Go黑帽子(第一章)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640604

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)