跨包创建结构体实例
跨包创建结构体实例
【1】创建不同的包:

你遇到的错误:
main.go:4:2: package demo11/model is not in std (C:\Program Files\Go\src\demo11\model)
这是因为 Go 的包导入路径是从 GOPATH 或 Go module 的根目录开始的。你现在的目录结构是:
demo11/
main/
main.go
model/
student.go
而你在 main.go 里这样导入:
import (
"demo11/model"
)
但你没有使用 Go Modules(没有 go.mod 文件),Go 默认会去 $GOPATH/src 下找 model,但你的代码实际在本地文件夹下。
解决方法:
方法一:使用 Go Modules(推荐)
-
在 demo11 目录下初始化 Go Modules:
cd d:\workstation\code\gocode\demo11go mod init demo11
-
然后在 demo11 目录下运行:
go run ./main/main.go
这样 import "demo11/model" 就能找到 student.go 了。
方法二:不用 Go Modules
把 main.go 和 student.go 放在同一个包下(比如都放在 demo11 目录下),或者把 model 目录放到 $GOPATH/src/demo11/model 下。
推荐用方法一,现代 Go 项目都用 Go Modules。
你的 main.go 文件参考:main/main.go
你的 model 文件参考:model/student.go
【2】student.go:
package model
type Student struct {
Name string
Age int
}
首字母S大写,可以在其他包下访问
【3】main.go:
package main
import (
"fmt"
"demo11/model" // 引入跨包的Student结构体
)
func main() {
//跨包创建结构体Student的实例
//var s model.Student = model.Student{"丽丽", 10}
s := model.Student{"丽丽",10,}
fmt.Println(s)
}
发现:如果结构体首字母大写的话,在其他包下可以访问
但是:如果结构体的首字母小写?

解决:结构体首字母小写,挎包访问没问题-->工厂模式
package model
type student struct {
Name string
Age int
}
//工厂模式
func NewStudent(n string,a int) *student {
return &student{n,a}
}
package main
import (
"fmt"
"demo11/model" // 引入跨包的Student结构体
)
func main() {
//跨包创建结构体Student的实例
//var s model.Student = model.Student{"丽丽", 10}
//s := model.student{"丽丽",10,}
//fmt.Println(s)
s := model.NewStudent("娜娜",20)
fmt.Println(*s)
}

浙公网安备 33010602011771号