go程序中同一个包下为什么会存在多个同名的函数或变量

目录

背景

一探究竟

增加构建约束 & 不同格式的构建约束


背景

首先,这种情况显然是不符合编译规则的,我们都知道在同一个包下出现两个同名的函数、变量、常量等会编译不通过,那么怎么还会有这种现象存在?

如下,源码中任意找一个有这种现象的包:

一探究竟

既然都是go代码,肯定是适配同一套逻辑的。

创建一个测试项目,创建一个包pkg,分别创建如下文件:

我们让mypkg包下的所有文件中都有GetPackageName函数(返回的值不同)、flag变量。

注意,这些文件目前并未提示redeclared。

然后main中调用GetPackageName函数。

在运行之前,编译器并没有显式的报错。接着go build,编译正常。运行结果输出了:

mypkg from windows

交叉编译一下Linux平台,运行:

mypkg from linux

看起来编译时自动找到对应文件处理了。

继续。

在mypkg包下接着新建一个名为openbsd.go的文件,和上述文件的函数保持同名,然后很明显的报错出来了:'GetPackageName' redeclared in this package

条件不变,且在pkg_windows.go文件已存在的前提下:

继续创建名为_openbsd.go的文件,没有报错。

继续创建名为pkg_amd64.go、pkg_x64.go、pkg_x86.go、othername_amd64.go等文件均会提示redeclared。

但创建的othername_arm64.go、pkg_linux_amd64.go、pkg_linux_arm64.go不会提示。

对于linux的两个文件,这里看着没毛病,实际上在linux、amd64平台上编译就会报错:

mypkg\pkg_linux_amd64.go:4:2: flag redeclared in this blockmypkg\pkg_linux.go:4:2: other declaration of flagmypkg\pkg_linux_amd64.go:7:6: GetPackageName redeclared in this blockmypkg\pkg_linux.go:7:6: other declaration of GetPackageName

是因为pkg_linux_amd64.go文件和pkg_linux.go文件的同名内容冲突了,在linux、amd64平台上编译,这两文件就会被适配到。

如果目标平台改为linux、arm64进行编译,也会报:

mypkg\pkg_arm64.go:4:2: flag redeclared in this blockmypkg\othername_arm64.go:4:2: other declaration of flagmypkg\pkg_arm64.go:7:6: GetPackageName redeclared in this blockmypkg\othername_arm64.go:7:6: other declaration of GetPackageNamemypkg\pkg_linux.go:4:2: flag redeclared in this blockmypkg\othername_arm64.go:4:2: other declaration of flagmypkg\pkg_linux.go:7:6: GetPackageName redeclared in this blockmypkg\othername_arm64.go:7:6: other declaration of GetPackageName

是因为othername_arm64.go文件、pkg_arm64.go和pkg_linux.go文件的同名内容冲突了,在linux、arm64平台上编译,这三个文件就会被适配到。

综合来看:

1,类似约定xxx_windows.goxxx_arm64.goxxx_linux_arm64.go命名的文件用于实现平台特定的代码。

2,编译器自动认识以_系统/arch名称结尾的go文件。

3,编译时,GOOS GOARCH都可以在文件名上来做构建约束,go编译器会根据当前操作系统自动选择匹配的文件进行编译。

增加构建约束 & 不同格式的构建约束

例如,针对不同的系统、架构的代码文件做相同的事情,我们可以进行编译约束:

即,顶部增加如下格式的约束(不能漏掉注释):

//go:build arm64 && freebsd

如下格式仅针对特定操作系统:

//go:build freebsd

如下格式针对特定的多个系统均可:

//go:build aix || darwin || freebsd || linux

如下格式的文件支持在linux系统、但不能在armarm64架构下进行编译

//go:build linux && !arm && !arm64

感叹号表示“非”。

以上是go 1.17及以上版本引入的格式,定义了一个布尔表达式,包含了逻辑运算符,条件可以更复杂。

与此不同,下面的格式是go 1.17以下支持的约束格式:

// +build freebsd

也会有两种格式并存的情况:

//go:build linux
// +build linux

因为也有环境是老编译器的情况,老版本的编译器不能识别新的约束语法。

go语言支持的系统和架构列表

#go tool dist listaix/ppc64android/386android/amd64android/armandroid/arm64darwin/amd64darwin/arm64dragonfly/amd64freebsd/386freebsd/amd64freebsd/armfreebsd/arm64freebsd/riscv64illumos/amd64ios/amd64ios/arm64js/wasmlinux/386linux/amd64linux/armlinux/arm64linux/loong64linux/mipslinux/mips64linux/mips64lelinux/mipslelinux/ppc64linux/ppc64lelinux/riscv64linux/s390xnetbsd/386netbsd/amd64netbsd/armnetbsd/arm64openbsd/386openbsd/amd64openbsd/armopenbsd/arm64openbsd/ppc64plan9/386plan9/amd64plan9/armsolaris/amd64wasip1/wasmwindows/386windows/amd64windows/armwindows/arm64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/702589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4 特征构造

4 特征构造 学习目标 知道未来信息的概念,及处理未来信息的方法掌握从原始数据构造出新特征的方法掌握特征变换的方法掌握缺失值处理的方法1 数据准备 1.1 梳理数据的内在逻辑 关系种类 一对一:一个用户有一个注册手机号 一对多:一个用户多笔借款 多对多:一个用户可以…

如何购买RAKsmart的国外高防服务器?

随着互联网的快速发展,网络安全问题日益凸显,特别是对于拥有在线业务的企业或个人来说,选择一款高防服务器显得尤为关键。美国RAKsmart作为知名的服务器提供商,其高防服务器因其卓越的性能和安全性,受到了广大用户的青…

阻抗控制理解之逆动态控制律

具有六个自由度的二阶机械系统,其特征是给定的质量、阻尼和刚度,称为机械阻抗。 用于运动控制的加速度解决方法,它旨在通过逆动力学控制律在加速度水平上解耦和线性化非线性机器人动力学。在与环境存在交互作用的情况下,控制律 考…

【Redis】Redis键值存储

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪&#x1f4aa…

STM32-08-串口

文章目录 STM32 串口1. 数据通信的基本概念2. 串口通信协议3. 串口4. 相关寄存器5. MSP回调机制6. HAL库中断回调机制7. USART/UART异步通信配置步骤8. IO引脚复用功能9. 代码实现 STM32 串口 1. 数据通信的基本概念 通信方式: 数据传输方向: 数据同…

六西格玛培训证书攻略2024:一站式解决方案助你快速上手

目前,企业对于员工的专业能力和综合素质要求越来越高。六西格玛作为一种先进的质量管理方法,已经成为众多企业提升运营效率、降低成本的重要手段。张驰咨询针对2024年六西格玛培训证书考取,为广大学员制定了实用的攻略,帮助学员们…

网络故障快速定位的秘诀 - 基于 AnaTraf 全流量回溯分析

网络故障是每个 IT 从业者都深有体会的头疼问题。当网络出现异常时,如何快速定位故障原因,恢复网络正常运行,是考验运维能力的关键所在。借助 AnaTraf 网络流量分析仪的全流量回溯分析功能,您可以轻松应对各种复杂的网络问题,实现快速故障定位。 1. 网络故障分析的痛点 网络故…

C++自定义脚本文件执行

FunctionCall.h&#xff1a; #include <sstream> #include <string> #include <vector> // 函数调用 class FunctionCall { public: FunctionCall(); ~FunctionCall(); std::string call(const st…

失误删除也能救回,推荐前10款手机数据恢复软件!

在手机的日常使用中&#xff0c;不可避免的会误删数据&#xff0c;这些数据可能包括照片、视频、联系人、短信等重要信息。不过好在市面上有很多优秀的手机数据恢复软件&#xff0c;可以帮助我们从各种情况下恢复丢失的数据。 本文将为您推荐十大手机数据恢复软件&#xff0c;…

Xxl-job实现定时任务视频转码

搭建XXL-JOB 调度中心 首先下载xxl-job GitHub&#xff1a;GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 码云&#xff1a;xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速…

三大国密浏览器简单介绍-行云管家

国密浏览器是指支持国密算法SM2/SM3&#xff0c;支持基于国密算法的SSL协议&#xff0c;支持采用国密SSL证书实现HTTPS加密的网站正常访问的浏览器。今天我们行云管家小编就给大家简单介绍一下三大国密浏览器&#xff0c;以便大家了解。 三大国密浏览器简单介绍-行云管家 1、密…

快速上手六步教你如何进行跨境电商ERP开发

跨境电商平台开发是当前电商行业的热门话题&#xff0c;一套高效的ERP系统对跨境电商平台的发展至关重要。在本文中&#xff0c;我将为你介绍六个简单而关键的步骤&#xff0c;帮助你快速上手进行跨境电商ERP开发。 步骤一&#xff1a;需求分析 在跨境电商平台开发之初&#…