跨包创建结构体实例

跨包创建结构体实例

【1】创建不同的包:

image

你遇到的错误:

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(推荐)

  1. demo11 目录下初始化 Go Modules:
    cd d:\workstation\code\gocode\demo11

    go mod init demo11

  2. 然后在 demo11 目录下运行:
    go run ./main/main.go

这样 import "demo11/model"​ 就能找到 student.go 了。


方法二:不用 Go Modules

main.gostudent.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)
}

发现:如果结构体首字母大写的话,在其他包下可以访问

但是:如果结构体的首字母小写?

image

解决:结构体首字母小写,挎包访问没问题-->工厂模式

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)
}

posted @ 2025-07-02 18:11  hutaodd  阅读(16)  评论(0)    收藏  举报