当前位置: 首页 > news >正文

go 命令行工具整理

这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。

比方说,-race 属性,go 语言 string 类型思考 博客中也有说到这个属性,用来检测数据动态竞争。-test 属性,go使用benchmark分析json库性能 中也有用到这个属性,等等吧。

go build

编译 go 的可执行文件,最终代码发布上线,肯定需要执行这个指令。或者在项目的 makefile 里就已经写好了这个指令,或者在 dockerfile 里。

ldflags -X

执行 go build 的时候,可能就会遇到指定这个属性的情况。这个属性可以用来动态设置代码中的变量,我们先通过一个例子来了解一下它的作用。

下面的例子中,声明了两个包变量,分别是版本号和应用名称。拿版本号来说,应用每次部署都需要生成一个新的版本号,我们需要在上线前把这个参数做指定。但如果靠硬编码的方式来处理,每次上线都需要手动修改这个变量。

这种情况,我们可以通过编译时动态设置的方式,来修改这个变量的值。-X 的作用在这个时候就体现出来了,在执行 go build 的时候指定这两个值。

package mainimport "fmt"var version string = ""
var name string = ""func main() {fmt.Println(version)fmt.Println(name)
}

go build 执行时进行包变量赋值, 指定的赋值方式:importpath.name=value。通过包路径.变量名 的引用方式来定位包变量。结合例子,我们在编译的时候指定了了变量 name 和 version 的值。

通过上述的例子,可以看出,-X 并不限制包变量是否可导出,不可导出的变量也可以进行赋值。

go build -ldflags "-X main.name=test -X main.version=1.2.0" main.go

这种指定包变量的场景,经常会在一些框架代码中使用,可以指定 git 的版本号,也可以指定部署的机房环境。通过这种方式,我们不再需要通过配置文件来修改这些变量,简化了我们的开发。

如果要给项目的其他包变量赋值,只需要替换包的名字就可以了。包的路径名称其实就是 import 的路径名称,这个 import 的路径名称其实是和 go.mod 中 module 的声明对齐的。

在这里插入图片描述

重新创建一个 hello 包,在包中声明了一个 hello 变量,然后,在 main 中调用 hello 包中的打印方法。我们演示一下给项目的其他包中赋值的过程。

类似的,就是替换一下包名。编译执行,输出的结果为 test。

go build -ldflags "-X github.com/think-next/lesson/ldflags/hello.hello=test" main.go

在这里插入图片描述

go tool nm

对于代码中包级别定义的变量,我们还可以通过 go tool nm 进行查看。那上面的例子来说,在控制台可以查看 hello 包中的定义的符号。

我们首先对项目做 go build ,然后使用 go tool 工具解析编译后的可执行文件。然后执行 go tool nm 来解析包级别的变量

go build main.go

使用 grep 过滤关键字中包含 hello 的行,-i 属性是忽略大小写匹配。

➜  ldflags git:(master) ✗ go tool nm main | grep -i hello111d0c0 D github.com/think-next/lesson/ldflags/hello..inittask112d0d0 D github.com/think-next/lesson/ldflags/hello.hello

技巧

上面的例子中, -X 中指定的变量都是硬编码的常量,但如果是正常业务,这些常量一定是自定义的变量。

编译的时候,自动获取当前 git 的版本号,自动获取当前 go 的版本号… 比如说,下面例子中的 main.version 要赋值的是当前编译 go 的版本号,我们该如何执行呢

go build -ldflags "-X main.name=test -X main.version=1.2.0" main.go

通过 shell 语句可以实现,使用 (goversion)来获取当前的go的版本号。(go version) 来获取当前的 go 的版本号。(goversion)来获取当前的go的版本号。$() 在 shell 中表示 命令替换,就是完成括号里面的指令,用指令的执行结果来替换。

但下面的指令无法正常执行,究其原因,是因为 go version 执行的结果中包含空格。对于输出结果中包含空格的情况,该如何解决呢。

go build -ldflags "-X main.name=test -X main.version=$(go version)" main.go

使用单引号将执行指令括起来,就可以正常输出了。这让我想起来了,awk 打印单双引号的例子。这些奇怪的 case,主要看作者在开发工具的时候,是如何解析参数的。

go build -ldflags "-X main.name=test -X 'main.version=$(go version)'" main.go

相关文章:

go 命令行工具整理

这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。 比方说&#x…...

RuntimeError: CUDA out of memory

今天在训练模型的时候突然报了显存不够的问题,然后分析了一下,找到了解决的办法,这里记录一下,方便以后查阅。 注:以下的解决方案是在模型测试而不是模型训练时出现这个报错的! RuntimeError: CUDA out of…...

Kubernetes1.25中Redis集群部署实例

1、概述我们知道在 Kubernetes 容器编排平台中, 我们可以非常方便的进行应用的扩容缩, 同时也能非常方便的进行业务的迭代,本章主要讲解在Kubernetes1.25搭建Redis单实例和Redis集群主从同步的环境流程步骤, 如果是高频访问重要的线上业务我们最好是部署在物理机器上…...

C++11实现计算机网络中的TCP/IP连接(Windows端)

目录引言1、TCP2、IP2.1 IP路由器3、TCP/IP4、TCP/IP协议C11实现参考文献引言 TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol)。[1] 在TCP/IP协议簇中主要包含以下内容: TCP (传输控制协议) - 应用程序…...

Spring框架自定义实现IOC基础功能/IDEA如何手动实现IOC功能

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 7.4 自定义Spring IOC 创建新模块,结构如图![[Pasted image 20230210173222.png]] 7.4.1 定义bean相关POJO类 7.4.1.1 定义propertyValue类 /** …...

pip离线安装windows版torch

文章目录前言conda创建虚拟环境安装torchtorch官网在线安装离线手动安装测试是否安装成功后记前言 学习的时候遇到几个机器学习相关的项目,由于不同的项目之间用到的依赖库不太一样,于是想利用conda为不同的项目创建不同的环境方便管理和运行&#xff0…...

Redis核心知识点

Redis核心知识点Redis核心知识点大全五种数据类型redis整合SpringBoot序列化问题渐进式扫描慢查询缓存相关问题数据库和缓存谁先更新缓存穿透缓存雪崩缓存击穿实际应用超卖问题分布式锁全局唯一ID充当消息队列Feed流附近商户签到HyperLogLog实现UV统计持久化RDBAOF持久化小结事…...

14. 最长公共前缀

14. 最长公共前缀 一、题目描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: …...

SignalR注册成Windows后台服务,并实现web前端断线重连

注意下文里面的 SignalR 不是 Core 版本,而是 Framework 下的 本文使用的方式是把 SignalR 写在控制台项目里,再用 Topshelf 注册成 Windows 服务 这样做有两点好处 传统 Window 服务项目调试时需要“附加到进程”,开发体验比较差&#xf…...

【前端笔试题二】从一个指定数组中,每次随机取一个数,且不能与上次取数相同,即避免相邻取数重复

前言 本篇文章记录下我在笔试过程中遇到的真实题目,供大家参考。 1、题目 系统给定一个数组,需要我们编写一个函数,该函数每次调用,随机从该数组中获取一个数,且不能与上一次的取数相同。 2、思路解析 数组已经有了…...

专栏关注学习

Node学习专栏(全网最细的教程) 【spring系列】 SpringCloud 前端框架Vue java学习过程 RocketMQ Spring Tomcat websocket 从头开始学Redisson 从头开始学Oracle 跟着大宇学Shiro 吃透Shiro源代码 Git基础与进阶 Java并发编程 Spring系列 手写…...

【手写 Vuex 源码】第八篇 - Vuex 的 State 状态安装

一,前言 上一篇,主要介绍了 Vuex 模块安装的实现,针对 action、mutation、getter 的收集与处理,主要涉及以下几个点: Vuex 模块安装的逻辑;Vuex 代码优化;Vuex 模块安装的实现;Vue…...

Mac下拉式终端的安装与配置 (iTerm2)

Mac下拉式终端的安装与配置 使用效果如图所示 安装前置软件 iTerm2 很可惜,如此炫酷的功能在原终端中并不能实现,我们需要借助iTerm2这个软件来实现。 官网链接:iTerm2 - macOS Terminal Replacement 我们点击download下载即可 配置 当我…...

使用 Spring 框架结合阿里云 OSS 实现文件上传的代码示例

使用 Spring 框架结合阿里云 OSS 实现文件上传的代码示例POM文件配置文件上传工具类控制层使用yaml配置文件(第二种用法,看公司要求)注入 OSSClient 对象及工具类(第二种用法,看公司要求)使用 Vue 前端代码…...

神经网络基础知识

神经网络基础知识 文章目录神经网络基础知识一、人工神经网络1.激活函数sigmod函数Tanh函数Leaky Relu函数分析2.过拟合和欠拟合二、学习与感知机1.损失函数与代价函数2. 线性回归和逻辑回归3. 监督学习与无监督学习三、优化1.梯度下降法2.随机梯度下降法(SGD)3. 批量梯度下降法…...

SpringBoot开发规范部分通用模板+idea配置【项目通用-1】

SpringBoot开发规范通用模板 1 分页插件使用 通过MybatisPlus配置分页插件拦截器 Configuration MapperScan("com.xuecheng.content.mapper") //拦截的mapper层 public class MybatisPlusConfig {//定义分页的拦截器Beanpublic MybatisPlusInterceptor getMybatisPl…...

程序的机器级表示part3——算术和逻辑操作

目录 1.加载有效地址 2. 整数运算指令 2.1 INC 和 DEC 2.2 NEG 2.3 ADD、SUB 和 IMUL 3. 布尔指令 3.1 AND 3.2 OR 3.3 XOR 3.4 NOT 4. 移位操作 4.1 算术左移和逻辑左移 4.2 算术右移和逻辑右移 5. 特殊的算术操作 1.加载有效地址 指令效果描述leaq S, DD…...

基于YOLOV5的钢材缺陷检测

数据和源码见文末 1.任务概述 数据集使用的是东北大学收集的一个钢材缺陷检测数据集,需要检测出钢材表面的6种划痕。同时,数据集格式是VOC格式,需要进行转化,上传的源码中的数据集是经过转换格式的版本。 2.数据与标签配置方法 在数据集目录下,train文件夹下有训练集数据…...

Session与Cookie的区别(三)

中场休息 让我们先从比喻回到网络世界里,HTTP 是无状态的,所以每一个 Request 都是不相关的,就像是对小明来说每一位客人都是新的客人一样,他根本不知道谁是谁。 既然你没办法把他们关联,就代表状态这件事情也不存在。…...

七大设计原则之接口隔离原则应用

目录1 接口隔离原则介绍2 接口隔离原则应用1 接口隔离原则介绍 接口隔离原则(Interface Segregation Principle, ISP)是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。这个原则指导我们在设计接口时…...

【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc

文章目录1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&…...

JavaScript HTML DOM - 改变CSS

JavaScript 是一种动态语言,它可以动态地修改网页的外观,并且使用HTML DOM(文档对象模型)可以更方便地控制HTML元素的样式。 JavaScript 通过在HTML DOM中更改CSS属性来更改样式,这些CSS属性包括颜色、位置、字体大小…...

mycat连接mysql 简单配置

mycat三个配置文件位于conf下 可通过Notepad操作 首先配置service.xml中的user标签&#xff0c;设置用户名&#xff0c;密码&#xff0c;查询权限&#xff0c;是否只读等 只是设置了root用户&#xff0c;有所有权限 配置schema.xml <?xml version"1.0"?&g…...

Spring常用注解

文章目录一、Bean交给Spring管理1、Component2、Bean3、Controller4、Service5、Repository6、Configuration7、ComponentScan二、作用域1、Lazy(false)Scope三、依赖注入1、Autowired2、Resource3、Qualifier四、读取配置文件值1、Value一、Bean交给Spring管理 1、Component …...

I.MX6ULL内核开发9:kobject-驱动的基石

目录 一、摘要 二、重点 三、驱动结构模型 四、关键函数分析 kobject_create_and_add()函数 kobject_create()函数 kobject_init&#xff08;&#xff09;函数 kobject_init_internal(&#xff09;函数 kobject_add&#xff08;&#xff09;函数 kobject_add_varg&am…...

Docker-harbor私有仓库

一、Harbor概述 1、Harbor的概念 • Harbor是VMware公司开源的企业级Docker Registry项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的Docker Registry服务 • Harbor以 Docker 公司开源的Registry 为基础&#xff0c;提供了图形管理UI、基于角色的访问控制(Role Base…...

Java之动态规划之子序列问题

目录 0.动态规划问题 一.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 二.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 三.最长重复子数组 1.题目描述 2.问题分析 3.代码实现 4.代码的优化(滚动数组) 四.最长公共子序列 1.题目描述 2.问题分析 3.代…...

java ArrayList

目录 一.简单介绍 二.ArrayList的底层结构 2.1ArrayList的底层结构和操作分析 2.ArrayList 底层源码分析 三.ArrayList 方法 四.代码使用方法 一.简单介绍 ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们…...

前端——周总结系列四

1 JS变量与常量 概述 变量&#xff1a;在后续编码过程中会被重新赋值&#xff0c;是不断变化的。常量&#xff1a;固定不变的数据&#xff0c;日常生活比如性别男&#xff0c;代码层面是在编码过程中不会变化的固定数据。 命名规则 变量 可以包含数字&#xff0c;字母&…...

Linux重定向符、管道符讲解

目录 重定向 将命令与文件进行互动 输出重定向 输入重定向 管道符 将命令与命令互动起来 重定向 将命令与文件进行互动 重定向分类 一般情况下&#xff0c;Linux命令运行时都会打开一下三个文件 标准输入文件&#xff1a;stdin文件&#xff0c;文件描述符为0&#xff0c;Li…...

网站建设的构思/推广软文范例大全500

一提到iPhone很自然而然的就会想到流畅&#xff0c;顺滑如斯&#xff0c;虽然近几年安卓手机也不卡&#xff0c;但是和iOS的流畅还是有很大差别的&#xff0c;说道这里使用安卓的小伙伴肯定会说&#xff0c;安卓现在比iOS都要流畅&#xff0c;安卓早已不是原来的安卓。但是我想…...

常州做网站的公司有哪些/怎样建立一个网站

list集合中对象某个字段取出并用逗号拼接 String emailStr userList.stream().map(User::getUserName).collect(Collectors.joining(","));取出userName字段并转成list List<String> collect1 userList.stream().map(p -> p.getUserName()).collect(Col…...

wordpress get_post_thumbnail/关键词优化排名怎么做

方案一&#xff1a; 窗体属于类&#xff0c;可以在窗体类中定义已全局变量&#xff0c;类型为公开、静态的。示例&#xff1a; public static string str "";注意是静态变量&#xff0c;如果为&#xff1a;public string str "";可能会出现问题&#xff0…...

wordpress 删除图片/重庆网络推广外包

简单的来说就是为了方便查找和导航代码用的。 下面举例如何快速的定位到我已经标识过的代码。#pragma mark 播放节拍器- (void) Run:(NSNumber *)tick{ //... } OK,那么如何查找呢&#xff0c;点击代码编辑器上面的导航栏即可&#xff1a;接着我修改一下代码&#xff1a;#pragm…...

费县做网站/网站整站优化

之前也没写过什么博客&#xff0c;可能文章结构比较混乱&#xff0c;想到那写到哪。主要是把自己学习中的经验写下来。为什么选择laravel框架&#xff0c;是因为laravel框架目前是Php最流行的框架&#xff0c;深入研究后发现和asp.net mvc框架在功能上基本上是伯仲之间。只是各…...

美食网网站建设目的/安徽网站关键词优化

length(object) #显示对象中元素/成分个数,length("")1 dim(object) #显示某个对象维度,行数与列数 names(object) #显示对象中各元素/成分名称 rm(object1,object2,...) #删除一个或者多个对象 nchar(x) #计算字符串x的长度,对于非字符对象不能用该函数,nchar(&quo…...