Go包初始化

2024-03-23

情况:

一个 Go 包A由 3 组成.go文件,并且我使用另一个包中的函数B在每个文件中。我必须导入包B在每个文件的开头。

问题:

是套餐B实际上初始化了3次还是只初始化了1次?


简短回答:初始化只会执行一次。

长答案:引用相关规范部分 -程序执行 http://golang.org/ref/spec#Program_execution:

没有导入的包的初始化方法是为其所有包级变量分配初始值,然后使用名称和签名调用任何包级函数

func init()

在其源代码中定义。带有名称的包范围或文件范围标识符init只能声明为具有此签名的函数。即使在单个源文件中,也可以定义多个此类函数;它们以未指定的顺序执行。

在包内,根据引用顺序初始化包级变量并确定常量值:如果 A 的初始化器依赖于 B,则 A 将在 B 之后设置。依赖性分析不依赖于 A 的实际值。项目被初始化,仅在它们在源中出现时进行。如果 A 的值递归地包含对 B 的提及、包含其初始值设定项提及 B 的值或提及提及 B 的函数,则 A 依赖于 B。如果这种依赖关系形成一个循环,则是一个错误。如果两个项目不是相互依赖的,它们将按照它们在源代码中出现的顺序进行初始化,可能在多个文件中,如呈现给编译器的那样。由于依赖性分析是按包进行的,因此如果 A 的初始化程序调用在引用 B 的另一个包中定义的函数,则可能会产生未指定的结果。

An init不能从程序中的任何地方引用函数。尤其,init不能显式调用,也不能指向init被分配给函数变量。

如果包具有导入,则导入的包会在初始化包本身之前初始化。如果多个包导入一个包P,P将只被初始化一次。

通过构造导入包可以保证初始化时不会出现循环依赖。

一个完整的程序是通过链接一个名为主包及其传递地导入的所有包。主包必须有包名main并声明一个函数main不带任何参数并且不返回任何值。

func main() { … }

程序执行首先初始化主包,然后调用函数main。当函数main返回,程序退出。它不会等待其他(非主)goroutine 完成。

包初始化——变量初始化和调用init函数——发生在单个 goroutine 中,按顺序,一次一个包。一个init函数可以启动其他 goroutine,它们可以与初始化代码同时运行。然而,初始化总是按顺序进行init功能:不会启动下一个init直到前一个返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go包初始化 的相关文章

  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • gcloud 部署应用程序找不到导入包 - golang

    我已经将应用程序的一个版本部署到 GAE 但现在部署新版本时遇到问题 当我尝试时gcloud app deploy version VERSION 我收到一堆错误 显示远程构建找不到我的导入包 Beginning deployment of
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • mysql 查询中的 golang 切片,带有 where in 子句

    我正在运行以下查询 但只获取第一个 id 值 select from table where table id in 1 2 3 4 5 6 7 9 11 13 14 15 17 and table deleted at is null 我
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • 使用 MongoDB Atlas 时 mongo-go-driver 因服务器选择超时而失败

    去版本 1 12 5 我有这个使用 node js mongo 驱动程序的代码 const MongoClient require mongodb MongoClient const uri process env MONGO HOST d
  • golang从sdin扫描一行数字

    我正在尝试从标准输入读取输入 3 2 1
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • Google Cloud Kubernetes 上任务队列的替代方案

    我发现任务队列主要用于App Engine标准环境 我正在将现有服务从 App Engine 迁移到 Kubernetes 任务队列的一个好的替代方案是什么 推送队列是当前正在使用的队列 我在线阅读文档并浏览了此链接 何时使用 PubSub
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os
  • 匿名结构和空结构

    http play golang org p vhaKi5uVmm http play golang org p vhaKi5uVmm package main import fmt var battle make chan string

随机推荐

  • 如何将 STDIN 内容转换为数组?

    我有一个包含以下内容的文件 INPUT 123 n 456 n 789 我想像这样运行我的脚本 script rb myArray STDIN to s myArray split n puts field size 我预计会打印 3 但我
  • 如何集成Neo4j数据库、NestJS框架和GraphQL?

    我正在尝试将我的 REST API NestJS 与带有 GraphQL 查询的新 Neo4j 数据库集成 有人成功吗 提前致谢 编辑1 我添加了我的代码 import Resolver from nestjs graphql import
  • 如何减少 Perl CGI 脚本的启动时间?

    我正在开发一些 CGI 脚本 并且正在尝试找到一种解决方案来减少使用 use 导入大量模块时产生的 启动时间 Update 提供的解决方案很好 但我正在使用的脚本在控制台和 CGI 模式下运行 检查是否存在一些典型的 HTTP 环境变量 在
  • Android 状态栏通知:使其不可清除并返回到应用程序(不启动新实例)

    我正在开发一个 Android 应用程序 我想要一个用户无法清除的状态栏通知 有谁知道这是怎么做到的吗 我在 Skimble 等应用程序中见过它们 在使用该应用程序时会出现不可清除的通知 另外 当用户单击 按下通知时 我希望它返回到已经运行
  • 如何指定指向重载函数的指针?

    我想将重载函数传递给std for each 算法 例如 class A void f char c void f int i void scan const std string s std for each s begin s end
  • 修剪 JSON.NET 中的 json 字符串

    我在用JObject ToString 方法将 JSON 对象转换为字符串 但是如何修剪输出以删除标记之间的空格 无需求助于使用正则表达式 只需使用Formatting None option string json jObject ToS
  • 'Class.forName("org.sqlite.JDBC");' 是什么意思做?

    我正在尝试使用 SQLite 数据库创建一个简单的应用程序 我选择使用SQLiteJDBC 驱动程序 http www zentus com sqlitejdbc 下面的代码取自上述网站 我的问题是关于 public static void
  • MVC2 中 Html.Partial(view, model) 和 Html.RenderPartial(view,model) 之间有什么区别(如果有)?

    当然 除了它返回的类型以及您以不同方式调用它的事实之外 如果它们不同 为什么要调用其中一个而不是另一个 定义 Type System Web Mvc Html RenderPartialExtensions Assembly System
  • 编辑 web.config 中的设置

    我不知道如何标题这个问题 我正在向 PayPal 的 Express Payment API 发出请求 我正在使用他们的 dll 来帮助发出请求并解析响应 他们的代码工作的说明是将您的授权凭据添加到web config文件 我已经这样做了
  • 如何将容器上的 localhost 端口转发到主机上的 localhost?

    我的主机上有一个守护进程在某个端口 即 8008 上运行 并且我的代码通常通过联系 localhost 8008 与守护进程交互 我现在已经容器化了我的代码 但还没有容器化守护进程 如何将容器上的 localhost 8008 转发到运行容
  • 如何拥有两个具有不同命名空间和相同 JAXB 类的不同端点?

    我正在使用弹簧肥皂ws 我有以下对应于复杂类型的 JAXB 域类 XmlAccessorType XmlAccessType FIELD XmlType name propOrder reference reason XmlRootElem
  • npm 更新检查失败

    昨晚我尝试更新我的节点和 npm 它似乎很成功 但是从那时起 每当我尝试运行任何 npm 命令时 我都会遇到同样的错误 我尝试卸载并重新安装 npm 但无法解决下面的错误消息 节点版本 v8 3 0 我收到的错误消息 npm update
  • 通话录音 - 使其在 Nexus 5X 上运行(可以生根或定制 ROM)

    我正在尝试使用AudioRecord with AudioSource VOICE DOWNLINK在 Nexus 5X Android 7 1 我自己的 AOSP 版本 上 我已经过了权限阶段 将我的 APK 移至特权应用程序 并进行了调
  • 无法安装 .apk 文件

    当我尝试执行 apk 文件时 出现以下错误 安装失败 缺少共享库 在命令提示符下 cd 到 adb 的路径 导航到 SDK 的 platform tools 目录 然后执行命令 adb d install path to your app
  • Rails 的 Mailchimp API - list.subscribe(:double_optin => false) 不起作用

    我正在使用 mailchimp api gem 可以通过提交电子邮件并将确认电子邮件发送到已注册的电子邮件来使提交的电子邮件正常工作 但我想禁用 double optin 标志 我正在尝试这样做 mc Mailchimp API new m
  • 从通用列表中查找项目

    我在从通用列表中获取记录时遇到问题 我创建了一个通用函数 我想从其中获取任何类型的类的记录 以下是示例代码 public void Test
  • Flutter:获取 Youtube 视频的缩略图

    我正在使用 youtube player flutter 在我的应用程序中播放 youtube 视频 有没有办法在 flutter 中获取 YouTube 视频的缩略图 我有一个 YouTube 视频 URL 我需要获取该 URL 的缩略图
  • 提供身份验证时,代理会缓存 HTTP 响应吗?

    给定一个 URI 其中包含正确配置的缓存标头 如果两个用户向同一 URI 发出请求 但提供两组不同的凭据 则代理是否会缓存每个用户 URI 或每个 URI 的响应 还是根本不缓存 该响应将仅用于其他用户 如果Cache Control响应头
  • 将文本框放置在 silverlight 数据网格列标题内

    如何在silverlight数据网格列标题内添加文本框 这样我就可以使用文本框进行过滤
  • Go包初始化

    情况 一个 Go 包A由 3 组成 go文件 并且我使用另一个包中的函数B在每个文件中 我必须导入包B在每个文件的开头 问题 是套餐B实际上初始化了3次还是只初始化了1次 简短回答 初始化只会执行一次 长答案 引用相关规范部分 程序执行 h