GO内部包

结论先行

  • go通过func名字首字母大小写来控制类属性是否可以被外部包访问(包括但不局限于func、struct)

  • go通过internal文件夹(包括子目录)来决定是否为内部包

首先看下我的测试文件夹结构(记得先执行go mod init test):

1
2
3
4
5
6
7
8
9
10
└─test
go.mod
│ test.go

└─test1
│ hello.go
│ test1.go

└─test2
test2.go

test.go内容如下:

1
2
3
4
5
6
7
8
9
package main
import (
"fmt"
"test/test1"
)
func main() {
fmt.Println("你调用了package main")
test1.Test1()
}

hello.go

1
2
3
4
5
6
7
package test1
import (
"fmt"
)
func Hello() {
fmt.Println("Hello")
}

test1.go

1
2
3
4
5
6
7
package test1
import (
"fmt"
)
func Test1() {
fmt.Println("你调用了package test1 Test1")
}

test2.go

1
2
3
4
5
6
7
8
9
10
package test2
import (
"fmt"
"test/test1"
)
func Test2() {
test1.Hello()
fmt.Println("你调用了package test2 Test2")
}

大小写测试

Test1()和Hello()都是可以被package main和package test2访问的。

测试把Test1()和Hello()改成test1()和hello()之后,代码无法运行。

internal测试

如果把Hello()改成hello(),那么test2和main包都无法访问test1包下的Hello()方法。可是我想要test2能够访问Hello()但是main不能访问,应该怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
13
└─test
go.mod
│ test.go

└─test1
│ test1.go

├─internal
│ hello.go

└─test2
test2.go
test3.go

test1文件夹下新建文件夹internal,把hello.go丢进去,同时更改文件内容的package

1
2
3
4
5
6
7
package internal
import (
"fmt"
)
func Hello() {
fmt.Println("Hello")
}

test2访问Hello()import "test/test1/internal"没问题;

man如果也访问import "test/test1/internal",会提示use of internal package test/test1/internal not allowed (compile)go-staticcheck

官网说明参考:https://golang.org/doc/go1.4#internalpackages


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!