- 主题:go的初始化顺序,竟然没有固定的顺序?
能放完整程序么,看起来 import 包并没有被调用
【 在 feng321 的大作中提到: 】
: 网上说 首先初始化 导入包里的init,可是我执行代码,有时候首先初始化 main 里的 init 函数。
: 初始化,没有固定顺序?
- 来自「最水木 for iPhone13,2」
--
FROM 115.192.191.*
我拿这代码测了没问题啊。是不是模块路径有问题,按你的项目结构,主包的名字应该是 geometry,不该是 third_xxxx,贴一下 go.mod 。
rectangle package initialized
main package initialized
Geometrical shape properties
area of rectangle 42.00
diagonal of the rectangle 9.22 %
【 在 feng321 的大作中提到: 】
: 这个是rectprops.go
: // rectprops.go
: package rectangle
: ...................
--
FROM 115.193.174.*
third_go_modules如果是主包的话,go.mod应该在主包的目录,跟src平级。谨慎怀疑这里混用了go module和go path。
【 在 feng321 的大作中提到: 】
: go.mod
:
: module third_go_modules
: ....................
- 来自「最水木 for iPhone13,2」
--
FROM 115.193.174.*
我是100% 子模块先初始化
? tree
.
├── geometry.go
├── go.mod
└── rectangle
└── rectprops.go
1 directory, 3 files
// go.mod
module smth
go 1.15
// geometry.go
package main
import (
"fmt"
"log"
"smth/rectangle" // 导入自定义包
)
...
【 在 feng321 的大作中提到: 】
: 关键是输出顺序不固定,我偶尔也有你这样的输出
: main package initialized
: rectangle package initialized
: ...................
--
FROM 115.193.174.*
go init 的规则虽然有点绕,但是确定的,按依赖关系最底层的init先执行,然后层层向上,不会出现随机。
go env -w GO111MODULE=on
设置默认使用 go module
【 在 feng321 的大作中提到: 】
: 程序可以运行。关键是多运行几次,每次的结果 顺序都不一样。你多运行几次看看
: [upload=1][/upload]
--
FROM 115.193.174.*
你看下上面回复你了,你的目录结构有问题,go.mod 应该跟 src 平级。当前 go.mod 应该没有生效,可能是GO_PATH给你兜底了。
坚持现在的目录结构是为什么
【 在 feng321 的大作中提到: 】
: 你用我的目录结构试试?反正我的输出顺序就是随机,QQ群里也说了类似“init输出随机”的
: [upload=1][/upload]
--
FROM 115.193.174.*
你第一张图贴出来的可不是这样,已经不太想再回答你了。
go的包管理历史上确实有点乱,init机制也确实隐晦,但是你的这个还是想当然了,不了解go module,我也经历过,所以才回复的。
go.mod 放对地方,运行不会有问题,没有随机
$ tree
.
├── go.mod
└── src
├── geometry.go
└── rectangle
└── rectprops.go
2 directories, 3 files
$ go run src/geometry.go
rectangle package initialized
main package initialized
Geometrical shape properties
area of rectangle 42.00
diagonal of the rectangle 9.22 %
【 在 feng321 的大作中提到: 】
: 你仔细看我的目录结构,go.mod 是跟src平级啊。你的是什么样的?
: [upload=1][/upload]
--
FROM 115.193.174.*
改成跟你的一样了,也没发现有什么问题
.
├── go.mod
└── src
└── geometry
├── geometry.go
└── rectangle
└── rectprops.go
【 在 feng321 的大作中提到: 】
: 你仔细看我的目录结构,go.mod 是跟src平级啊。你的是什么样的?
: [upload=1][/upload]
--
FROM 115.193.174.*
一楼的图呀。而且也不觉得这是windows下的go的问题。
初始化顺序属于语言的根本了,容许随机没法玩。
你听的说法,估计是同一个目录(包)下面,多个文件都有init的顺序问题,按文件名排序,不是太好,所以一般会建议不要在一个包里写多个init。
有依赖关系的两个包,底层先初始化
【 在 feng321 的大作中提到: 】
: 估计你用的linux,我用的windows吧。我的go.mod一直和src在同一目录。你说的“第一张图”是指几楼的图?
: 【 在 StephenLee 的大作中提到: 】
: : 你第一张图贴出来的可不是这样,已经不太想再回答你了。
: ....................
- 来自「最水木 for iPhone13,2」
--
FROM 115.193.174.*