Golang中如何从同一包导入依赖项

Golang中如何从同一包导入依赖项 即使我们在同一个包中但拥有不同的文件,我们是否需要将结构体、元素等设为公开?

例如:

core/utils/utils.go

package core
some code

core/strategies/fifo.go

package core
import core "imc/core"

等等

4 回复

core/utils/utils.go 属于 core/utils/corecore/strategies/fifo.go 属于 core/strategies/core

虽然它们通常被简称为核心包,但实际上是两个不同的包,因此不存在共享一说。

更多关于Golang中如何从同一包导入依赖项的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我认为你应该系统地学习Go的包管理系统。一般来说,同一个目录下的go文件属于同一个包,共享私有变量、函数等。嵌套的子目录或子目录中的go文件不算在内。跨包引用只能引用公开的函数、变量等,这些是暴露给包的,通常以大写字母开头。

所以看起来,当涉及到不同文件夹时,我们需要为每个 .go 文件提供唯一的包名吗? 如果我理解有误请纠正我 - “core/utils/utils.go” 应该有一个唯一的包名(例如 “utils”),然后我们需要为这个包提供导入语句?

在Go语言中,同一个包内的所有文件共享相同的包作用域,不需要导入。所有未导出的标识符(以小写字母开头)在同一个包内都是可见的。

示例:

core/utils/utils.go

package core

// 未导出的结构体,同一包内可访问
type internalConfig struct {
    timeout int
}

// 导出的函数,可被外部包访问
func ProcessData() {
    c := internalConfig{timeout: 30}
    c.process()
}

// 未导出的方法,同一包内可访问
func (c *internalConfig) process() {
    // 实现细节
}

core/strategies/fifo.go

package core

// 不需要导入core包,直接使用同一包内的标识符
func FIFOStrategy() {
    // 直接使用utils.go中的未导出结构体
    config := internalConfig{timeout: 60}
    
    // 直接调用未导出的方法
    config.process()
    
    // 调用导出的函数
    ProcessData()
}

关键点:

  1. 同一个包内的文件不需要相互导入
  2. 以小写字母开头的标识符在同一包内完全可见
  3. 只有需要被外部包访问的标识符才需要以大写字母开头

错误示例(不要这样做):

package core

// 错误:不需要导入自己的包
import core "imc/core"  // 这是错误的

func SomeFunction() {
    // 不需要这样使用
}

在您的示例中,core/utils/utils.gocore/strategies/fifo.go都属于core包,因此它们可以直接访问彼此的所有标识符(无论是否导出),无需任何导入语句。

回到顶部