示例
pkg.go
package pkg
import "fmt"
var TestVer1 = "TestVer1" // public
var tesVer2 = "tesVer2" // private
const (
TestConst1 = "TestConst1" // public
testConst2 = "testConst2" // private
)
// public 结构体
type TestStruct1 struct {
Field1 string // public
field2 string // private 外部不可访问
}
// private 结构体
type testStruct2 struct {
Field1 string
field2 string // private 外部不可访问
}
// public 方法
func (ts1 TestStruct1) Test1() {
fmt.Println(TestConst1)
}
// private 方法
func (ts1 TestStruct1) test2() {
fmt.Println(testConst2)
}
// public 方法
func (ts2 testStruct2) Test21() {
fmt.Println(testConst2)
}
// private 方法
func (ts2 testStruct2) test21() {
fmt.Println(testConst2)
}
// 包内函数均可正常访问
func f() {
fmt.Println(testConst2, tesVer2)
// private 结构体
t := testStruct2 {
Field1: "we",
field2: "lee", // private 字段
}
t.test21() // private 方法
}
main.go
package main
import (
"fmt"
"demo/pkg"
)
func main() {
fmt.Println( pkg.TestConst1 ) // 正常
fmt.Println( pkg.TestVer1 ) // 正常
ts := pkg.TestStruct1{ Field1: "test" } // 正常
ts.Test() // 正常
ts.test2() // 报错
ts2 := pkg.TestStruct1{ Field1: "test", field2: "dddd" } // 报错
}
目录结构嵌套示例
i-demo/
如上结构,在 internal 目录中有 d包和e包
如果跨了一层目录,也就是 internal 父目录的父目录
所以只要跨越了一个父目录,就没办法使用 internal 下面的开的程序实体
internal目录的意义
1 )第一种方式: 通过本地包的方式导入
mkdir private-pkg
cd private-pkg
go mode init github.com/xxx/private-pkg
这里的 xxx 作为示例,可替换成你们自己gitlab或gitee等真实的仓库mkdir pkg && touch pkg.go
package pkg
var Pkg string
module github.com/xxx/private-pkg
touch main.go
// main.go
package main
import (
"fmt"
"xxx.gitlab.com/xxx/private-pkg" // 注意,这里是红色的,说明目前有问题
)
func main() {
fmt.Println(pkg.Pkg) // 这里是 红的
}
go mod init xxx-pkg
同上,这里的 xxx 也是随意举例的写法go mod tidy
发现并没有在网络上拉取包并写入go.mod中module xxx-pkg
go 1.20
require(
xxx.gitlab.com/xxx/private-pkg latest
)
go mod tidy
直接报错
*.gitlab.com
module xxx-pkg
go 1.20
require(
xxx.gitlab.com/xxx/private-pkg => ../private-pkg
)
go mod tidy
exclude (
dependency latest
)
例如:exclue (
github.com/google/uuid v1.1.0
)
2 )第二种方式: 通过私有仓库的方式来导入
示例
go env -w GO111MODULE=on
export GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
go env -w GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
export GOPRIVATE=*.gitlab.com
go env -w GOPRIVATE=*.gitlab.com
go mod tidy
GOPROXY
: 顾名思义就是go用来下载依赖包的一个代理。
GOPROXY="off"
表示不许从任何源下载依赖包GOPRIVATE
: 组织内部的源,非公网上
GONOPROXY
: 与 GOPRIVATE
有相同作用
GONOSUMDB
GONOPROXY
与 GOPROXY
与 GOPRIVATE
区别
如果要使用 GONOPROXY
和 GONOSUMDB
配置的一般顺序是
实际工作中,只需要配置 GOPROXY 和 GOPRIVATE