Golang Go语言 package 权限问题

发布于 1周前 作者 h691938207 来自 Go语言

Golang Go语言 package 权限问题

假设一个项目的布局如下:

pkg/
    cache/
          redis/redis.go       // package xxx/pkg/cache/redis
          memory/memory.go     // package xxx/pkg/cache/memory
          utils.go             // package xxx/pkg/cache
go.mod
main.go

在 redis.go 和 memory.go 中有些共性的方法或者功能,提取出来放在 utils.go 中,以大写字母开头的函数。

我希望 utils.go 中的代码只能被 pkg/cahce 下面的子包访问,不能被其他外部代码访问。


更多关于Golang Go语言 package 权限问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

pkg/cache 下建一个目录 internal,把 utils.go 放里边。

https://golang.org/doc/go1.4#internalpackages

更多关于Golang Go语言 package 权限问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


懂了,感谢

一整个项目有一个 internal 就行,,不然代码提示的时候,选起来麻烦。

最好别用 pkg

同意,同时建议目录深度可以再平一点

pkg 有可能是放二进制可执行文件的地方,所以避免取类似的名字

楼主,你最终是怎样处理的?我也想学习一下,看英文文档真是头疼。

pkg 在 go 里就是放公用库的地方. 不过是 go standard layout 还是知名项目, 如 kubernetes 皆是如此.

在Go语言中,package的权限管理主要依赖于命名约定和代码组织结构,而不是像某些其他语言那样通过显式的访问修饰符(如public、private)来控制。以下是一些关键点,帮助你理解Go语言中package的权限问题:

  1. 包可见性

    • 在Go中,如果一个标识符(如变量、函数、类型等)以小写字母开头,则它是“未导出的”,只能在定义它的包内部访问。
    • 如果标识符以大写字母开头,则它是“导出的”,可以被其他包通过包路径来访问。
  2. 包命名

    • 通常,内部实现细节会放在以小写字母开头的包名(或内部包)中,以避免被外部直接访问。
    • 公开API则放在以大写字母开头的包名中。
  3. 代码组织

    • 通过合理的包结构来组织代码,可以有效控制访问权限。例如,可以将库的内部实现细节放在一个单独的包中,而这个包不会被外部导入。
  4. 单例模式与封装

    • 虽然Go没有直接的访问修饰符,但你可以通过单例模式、工厂函数、接口等方式来实现封装和权限控制。
  5. 文档与约定

    • 在大型项目中,通常会通过文档和代码约定来明确哪些部分是公开的API,哪些部分是内部实现细节。

总之,Go语言的权限管理依赖于命名约定和代码组织结构,而不是显式的访问修饰符。通过合理的包命名和代码组织,你可以有效地控制包的访问权限。

回到顶部