前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从外部设置传入Go变量

从外部设置传入Go变量

作者头像
sunsky
发布于 2020-08-19 08:08:55
发布于 2020-08-19 08:08:55
1.3K00
代码可运行
举报
文章被收录于专栏:sunskysunsky
运行总次数:0
代码可运行

前提:必须在build/run时指定 -ldflags="-X main.a=2.0 -X main.b=1" , 且a,b必须是string的变量,不能是常量, 不能是struct.

CloudFlare的DNS服务器RRDNS是用Go编写的,DNS团队用于生成version.go在Makefile中调用的文件。version.go看起来像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// THIS FILE IS AUTOGENERATED BY THE MAKEFILE. DO NOT EDIT.

// +build	make

package version

var (
	Version   = "2015.6.2-6-gfd7e2d1-dev"
	BuildTime = "2015-06-16-0431 UTC"
)

并用于在RRDNS中嵌入版本信息。它是用Makefile里建立sedgit describe从模板文件。它奏效了,但非常难看。

今天我们注意到数据团队CloudFlare的另一个Go团队使用-X链接器选项将更多版本号烘焙到二进制文件中。

可以设置的-X Go链接器选项设置-ldflags链接的Go程序中字符串变量的值。你这样使用它:-X main.version 1.0.0

一个简单的例子:假设您将此源文件另存为hello.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

var who = "World"

func main() {
    fmt.Printf("Hello, %s.\n", who)
}

然后你可以使用go run(或其他构建命令,如go buildgo install-ldflags来修改who变量的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ go run hello.go
Hello, World.
$ go run -ldflags="-X main.who CloudFlare" hello.go
Hello, CloudFlare.

格式是importpath.name string,因此可以在Go程序中的任何位置设置任何字符串的值,而不仅仅是在main中。请注意,从Go 1.5开始,语法已更改importpath.name=string。旧样式仍然受支持,但链接器会抱怨。

我担心这不适用于外部链接(例如使用cgo时),但正如我们所看到的,-ldflags="-linkmode=external -v"Go链接器首先运行并且照顾我们的-X

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ go build -x -ldflags="-X main.who CloudFlare -linkmode=external -v" hello.go
WORK=/var/folders/v8/xdj2snz51sg2m2bnpmwl_91c0000gn/T/go-build149644699
mkdir -p $WORK/command-line-arguments/_obj/
cd /Users/filippo/tmp/X
/usr/local/Cellar/go/1.4.2/libexec/pkg/tool/darwin_amd64/6g -o $WORK/command-line-arguments.a -trimpath $WORK -p command-line-arguments -complete -D _/Users/filippo/tmp/X -I $WORK -pack ./hello.go
cd .
/usr/local/Cellar/go/1.4.2/libexec/pkg/tool/darwin_amd64/6l -o hello -L $WORK -X main.hi hi -linkmode=external -v -extld=clang $WORK/command-line-arguments.a
# command-line-arguments
HEADER = -H1 -T0x2000 -D0x0 -R0x1000
searching for runtime.a in $WORK/runtime.a
searching for runtime.a in /usr/local/Cellar/go/1.4.2/libexec/pkg/darwin_amd64/runtime.a
 0.06 deadcode
 0.07 pclntab=284969 bytes, funcdata total 49800 bytes
 0.07 dodata
 0.08 symsize = 0
 0.08 symsize = 0
 0.08 reloc
 0.09 reloc
 0.09 asmb
 0.09 codeblk
 0.09 datblk
 0.09 dwarf
 0.09 sym
 0.09 headr
host link: clang -m64 -gdwarf-2 -Wl,-no_pie,-pagezero_size,4000000 -o hello -Qunused-arguments /var/folders/v8/xdj2snz51sg2m2bnpmwl_91c0000gn/T//go-link-mFNNCD/000000.o /var/folders/v8/xdj2snz51sg2m2bnpmwl_91c0000gn/T//go-link-mFNNCD/000001.o /var/folders/v8/xdj2snz51sg2m2bnpmwl_91c0000gn/T//go-link-mFNNCD/go.o -g -O2 -g -O2 -lpthread
 0.17 cpu time
33619 symbols
64 sizeof adr
216 sizeof prog
23412 liveness data
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go mod包依赖管理工具使用详解
对比上面几点: 目前做的最好的也就 maven了,gradle没有使用过,不知道。
OwenZhang
2021/12/08
9850
Go mod包依赖管理工具使用详解
初学者没有搞明白的GOROOT,GOPATH,GOBIN,project目录
coders
2018/01/04
2.4K0
初学者没有搞明白的GOROOT,GOPATH,GOBIN,project目录
OpenHarmony开源鸿蒙build编译模块的原理和系统配置解析
小帅聊鸿蒙
2024/10/13
5650
OpenHarmony开源鸿蒙build编译模块的原理和系统配置解析
GO笔记之详解GO的编译执行流程
上篇文章介绍了Golang在不同系统下的安装,并完成了经典的Hello World案例。在这个过程中,我们用到了go run命令,它完成源码从编译到执行的整个过程。
波罗学
2019/07/31
1.3K0
【文末有惊喜】初探Go的编译命令执行过程
Go 语言这两年在语言排行榜上的上升势头非常猛,Go 语言虽然是静态编译型语言,但是它却拥有脚本化的语法,支持多种编程范式(函数式和面向对象)。Go 语言最最吸引人的地方可能是其原生支持并发编程(语言
李海彬
2018/03/28
1.6K0
【文末有惊喜】初探Go的编译命令执行过程
go 编译执行文件分发
今天咱们不说go的语法知识,为什么不说语法了呢?因为咱们做了这么就的go东西全是在编辑器中运行的,大家是不是很想知道怎么在编辑器之外去执行go程序呢?(win的.exe文件 linux ./xx)…
大话swift
2019/07/19
1.6K0
Go 学习笔记-1
今天在编译一个 Go 的项目的时候,然后将可执行文件放在 Docker 容器中运行,发现报错了。报错的信息是这样的。
runzhliu
2020/08/06
3860
Go 程序是怎样跑起来的
刚开始写这篇文章的时候,目标非常大,想要探索 Go 程序的一生:编码、编译、汇编、链接、运行、退出。它的每一步具体如何进行,力图弄清 Go 程序的这一生。
梦醒人间
2019/07/04
1.4K0
第9节 Go的执行原理以及Go命令
命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。
小尘哥
2019/06/04
6310
第9节 Go的执行原理以及Go命令
劫持 Golang 编译
前段时间学习了 0x7F 师傅的「dll 劫持和应用」,其中提到通过 dll 劫持来劫持编译器实现供应链攻击,不由想到 Go 中的一些机制也可以方便地实现编译劫持,于是做了一些研究和测试。
Seebug漏洞平台
2021/11/10
1.4K0
02 . Go语言的变量,常量,作用域
变量是几乎所有编程语言中最基本的组成元素,从根本上来说,变量相当是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后通过引用变量名来使用这块存储空间
iginkgo18
2020/09/27
1.1K0
02 . Go语言的变量,常量,作用域
Go 1 – 概览/安装
安装地址位于:/usr/local/Cellar/go 安装成功后,go 的可执行文件夹会被配置到环境变量,即可以直接使用 go 命令:
全栈程序员站长
2022/11/07
4680
Go 1 – 概览/安装
golang源码分析(36)cgo
GO调C基本原理CGO是实现Go与C互操作的方式,包括Go调C和C调Go两个过程。其中Go调C的过程比较简单。对于一个在C中定义的函数add3,在Go中调用时需要显式的使用C.add3调用。其中C是在程序中引入的一个伪包
golangLeetcode
2022/08/02
1.4K0
Go 1.18.1 Beta 尝鲜
昨天,go 终于发布了 1.18 的 beta 版本, 带来了大家期待已久的泛型,抓紧时间康康能不能赶上热乎的。
JuneBao
2022/10/26
8810
调试 Go 的代码生成
原文:https://studygolang.com/articles/19815
sunsky
2020/08/20
5720
调试 Go 的代码生成
Go程序生命周期
本文希望能讲清楚一个Go程序从开始写下第一行代码到程序完全退出这期间都发生了什么事情,当然每个程序的执行逻辑千差万别,但这里想讲清楚的事情是所有程序都共通的事情,所有程序都需要经历的处理逻辑。
wish42
2021/10/19
8420
我是如何实现Go性能5倍提升的?
代码的稳健、可读和高效是每一位 coder 的共同追求,写出更高效的代码不仅让自己爽、让 reviewer 赏心悦目,更能对业务带来实际的正面影响。本文将从实践及源码层面对 Go 的高性能编程进行解析,带你进入 Go 的高性能世界。
腾讯云开发者
2024/01/04
2.1K1
我是如何实现Go性能5倍提升的?
100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具
在学习和使用Go语言过程中,了解其执行原理和常用命令是非常重要的。同时,编写规范的代码和使用常用工具也是提高开发效率和代码质量的关键。本文将深入探讨Go语言的执行原理,介绍常用的命令,以及详细讲解编码规范和常用工具的使用方法。
猫头虎
2024/04/08
6100
100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具
【从零开始学习Go语言】二.Go语言的安装
在前一篇文章有介绍过,go语言是google维护与更新,开发人员也都是在谷歌工作的人员,可能都会担心众所周知的防火墙,之前确实被屏蔽了,想要下载的话,可以通过此地址进行下载 —传送门
一只特立独行的兔先生
2020/03/25
4.2K0
【从零开始学习Go语言】二.Go语言的安装
Go 语言开发环境搭建
如果提示没有权限,加上sudo以root用户的身份再运行。执行完就可以在/usr/local/下看到go目录了。
贾维斯Echo
2023/10/18
7310
Go 语言开发环境搭建
相关推荐
Go mod包依赖管理工具使用详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验