今天准备跟大家讲解关于interface的 带方法的非空接口 和 不带方法的空接口;
看一下汇编代码中的深层数据结构;
回家执行:
【资料图】
go tool compile -S interface2.go
发现虚拟机中命令行报错:
我就很纳闷儿,我在公司是没问题的,因此我google找一些大佬看下问题;
的问题;
知道了编译过程中fmt这个包会编译成一个静态库文件.a
这样我就专门写了一个引用 fmt包的go文件进行go build 查看其编译过程;
go build -x -v -a myA.go 2>&1 | more > br.txt
将myA.go文件进行编译查看其编译过程,导入到br.txt文件中
package mainimport "fmt"func main() { fmt.Println(1)}
找到文件中编译过程中的fmt包编译过程:
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b002/_pkg_.a -trimpath "$WORK/b002=>" -p fmt -std -complete -buildid S7VmaYzQ3wdSCzOFapTF/S7VmaYzQ3wdSCzOFapTF -goversion go1.20.3 -nolocalimports -importcfg $WORK/b002/importcfg -pack /usr/local/go/src/fmt/doc.go /usr/local/go/src/fmt/errors.go /usr/local/go/src/fmt/format.go /usr/local/go/src/fmt/print.go /usr/local/go/src/fmt/scan.go
将其改成我自己手动执行的:
/usr/local/go/pkg/tool/linux_amd64/compile -o pkg.a -p fmt -std -complete -buildid S7VmaYzQ3wdSCzOFapTF/S7VmaYzQ3wdSCzOFapTF -goversion go1.20.3 -nolocalimports -pack /usr/local/go/src/fmt/doc.go /usr/local/go/src/fmt/errors.go /usr/local/go/src/fmt/format.go /usr/local/go/src/fmt/print.go /usr/local/go/src/fmt/scan.go
发现不行报错:
发现包还会引用更多的包,因此直接找编译生成好的.a文件直接用;
找到了这一行:
直接到:
/root/.cache/go-build/b7/
这个路径下找,还真找到了这个文件;
将这个文件拷贝到,我们需要汇编的文件夹:
创建 fmt包替换文件:
importcfg.txt 内容:
packagefile fmt=fmt.a
之后直接进行汇编:
go tool compile -p twzz -importcfg importcfg.txt interface2.go
生成了.o的汇编文件;我们就可以通过指令查看我们需要的汇编代码了:
go tool objdump -S -s "^twzz.p3e$" interface2.o
我们如果需要自己的汇编代码:
go tool compile -p foo -o foo.a -importcfg importcfg.txt foo.go
网址:
Go1.20编译静态库过程记录
https://blog.csdn.net/baixvkwfn/article/details/128942195
golang中生成静态库(.a文件)并操作静态库
https://blog.csdn.net/huha666/article/details/121305696