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

go语言同一包中的同一变量实现不同平台设置不同的默认值 //go:build 编译语法使用示例

在使用go来开发跨平台应用的时候,比如配置文件的路径,我们希望设置一个默认值,windows下的路径是类似  d:\myapp\app.conf 这样的, unix系统中的路径是 /opt/myapp/app.conf 这样的, 而我们在使用的时候需要使用的是同一个变量名来代表他们, 那么就要把 //go:build  这个请出来了, 他可以根据不同的平台来编译对应的go文件。

对于这类的信息我们一般只是模块内使用,那最好是是使用 internal文件夹来保护一下,如我们假设有如下2个文件来保存我们的默认配置信息:

internal/vars/defaults_notwin.go
internal/vars/defaults_windows.go

这2个文件内容如下:

defaults_notwin.go 

//go:build !windows
// 非windows系统编译package varsvar (DefaultConfigFile = "/opt/myapp/app.conf")

defaults_windows.go

package varsimport ("os"
)var (DefaultConfigFile        = os.Getenv("SYSTEMDRIVE") + `\myapp\app.conf`
)

可见他们的包名一样,2个文件里面定义的变量名也是一样的, 而我们的编译器却不会报错,这个是为什么呢? 

细心的你应该看出,在第一个文件defaults_notwin.go 的开头 有1行"注释"  //go:build !windows

注意,在//后面没有空格,这个是go里面的特殊用法,而注释通常在//后面是有一个空格的 

这个地方的 //go:build !windows 表示告诉编译器 当前文件在非windows系统时编译,而另外一个文件 defaults_windows.go  就只会在windows系统时才会编译, 则就保证了同一个包中使用了2个同名变量而不会报错。

我们在代码中要使用这个变量的时候就可以直接使用  confFileDefault := vars.DefaultConfigFile 而不用考虑当前平台是windows还是unix了。

相关文章:

  • taskENTER_CRITICAL()分析
  • 数据可视化:解析其在现代生活中的日益重要地位
  • 6个PPT素材模板网站,免费!
  • wine的使用 ubuntu入门之二十三
  • linux 查看 线程名, 线程数
  • 【C++】开源:RabbitMQ安装与配置使用(SimpleAmqpClient)
  • Python库之Scrapy-Redis的高级用法深度解析
  • 2023职称继续教育--新时代如何培养和造就未来科技创新领军人才
  • linux下can-utils的使用以及can接口的配置(以ubuntu20.04为例)
  • 为啥装了erlang,还报错erl: command not found?
  • STM32 HAL库USART的接收数据方法实现(STM32Cube_FW_F1_V1.8.5)
  • 使用last查看系统登录情况
  • 开源与闭源 AI 模型:发展路径的比较与前瞻
  • 【SAP HANA 33】前端参数多选情况下HANA如何使用IN来匹配?
  • k8s集群的存储卷、pvc和pv
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2019.2.20 c++ 知识梳理
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • GraphQL学习过程应该是这样的
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript HTML DOM
  • js作用域和this的理解
  • MySQL用户中的%到底包不包括localhost?
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • SQLServer之索引简介
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 力扣(LeetCode)56
  • 设计模式走一遍---观察者模式
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 算法-插入排序
  • 微信小程序:实现悬浮返回和分享按钮
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (70min)字节暑假实习二面(已挂)
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (黑马点评)二、短信登录功能实现
  • (三)mysql_MYSQL(三)
  • (转)Google的Objective-C编码规范
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET C# 配置 Options
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET的微型Web框架 Nancy
  • .NET构架之我见
  • @EnableWebSecurity 注解的用途及适用场景
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [4.9福建四校联考]
  • [AIGC] Java List接口详解
  • [AIGC] MySQL存储引擎详解
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [AutoSar]工程中的cpuload陷阱(三)测试