golang的包名中带有 internal 引入

16.png

在一个项目中,引入下面这个包,会报错

import (
    "github.com/zeromicro/go-zero/internal/devserver"
)

use of internal package github.com/zeromicro/go-zero/internal/devserver not allowed

could not import github.com/zeromicro/go-zero/internal/devserver (invalid use of internal package "github.com/zeromicro/go-zero/internal/devserver")

这是因为,在 Go 语言中包名包含 internal 是一种特殊的约定,用于限制包的可见性。

Go 工具链对 internal 目录有特殊处理,这是 Go 模块系统中的一个访问控制机制。
它能帮助我们隐藏内部实现细节,防止外部模块误用私有代码

这是 go1.4 官方文档给出的解释
https://go.dev/doc/go1.4#internalpackages

internal 的包,只能被其父目录及其子目录下的代码导入

目录结构_1

github.com/myapp/
├── main.go
├── internal/
│   └── helper/
│       └── utils.go
└── external/
    └── consumer.go

✅ main.go 可以正常导入,因为它和 internal/ 同属于 myapp/ 目录。

❌ external/consumer.go 不能导入该 internal 包,即使 external/ 和 internal/ 是同级目录,Go 也认为它“不在允许范围内”。

目录结构_2

mymod/
├── internal/          ← 仅 mymod/ 下的代码可访问
└── service/
    ├── internal/      ← 仅 service/ 及其子目录可访问
    └── user/
        └── handler.go

✅ mymod/main.go 可以访问 mymod/internal,但不能访问 mymod/service/internal。
✅ service/user/handler.go 可以访问 service/internal,也可以访问 mymod/internal(因为它在 mymod 子树下)。

远程包

本地包都不行,远程包里带 internal 的更不行

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容