首页 新闻 会员 周边 捐助

golang的import导入自定义的包报错

0
[待解决问题]

encapsulate //encapsulate里面有两个包:model和main
--model //model包
----person.go
--main // main
-----main.go

我在main.go 中导入model包,结果import 那里报错。请问,golang如何导入自定义的包person.go的代码?

//main.go===
package main

import (
"encapsulate/model" //这里报错。
"fmt"
)

func main() {
p := model.NewPerson("charlie")
p.setAge(18)
p.setSal(254.1)
fmt.Println(p.getAge)
fmt.Println(p.getSal)
}
//=============

//person.go==
package model

// program from other pkg can't access
type person struct {
Name string
age int
sal float64
}

// factory mode funciton, act as constructor
func NewPerson(name string) *person {
var p *person = new(person)
p.Name = name
return p
}

func (p *person) setAge(age int) {
p.age = age
}

func (p *person) getAge() int {
return p.age
}

func (p *person) setSal(sal float64) {
p.sal = sal
}
func (p *person) getSal() float64 {
return p.sal
}
//===============

绘心人的主页 绘心人 | 菜鸟二级 | 园豆:224
提问于:2023-05-01 19:38
< >
分享
所有回答(3)
0

从您提供的文件目录结构来看,您需要将 encapsulate 文件夹作为您的项目根目录,因此在 main.go 中导入 model 包的语句应该改为:

go

import "encapsulate/main/model"
注意,此时包的路径是相对于项目根目录的相对路径,而不是绝对路径。在您的 person.go 文件中,您定义了一个私有类型 person,所以在其他包中无法直接访问。如果您需要在其他包中使用它,则需要将其改为公共类型,即将其名称首字母大写。例如,将 person 改为 Person:

go

package model

type Person struct {
Name string
age int
sal float64
}

func NewPerson(name string) *Person {
var p *Person = new(Person)
p.Name = name
return p
}

func (p *Person) SetAge(age int) {
p.age = age
}

func (p *Person) GetAge() int {
return p.age
}

func (p *Person) SetSal(sal float64) {
p.sal = sal
}

func (p *Person) GetSal() float64 {
return p.sal
}
然后在其他包中,您就可以通过 model.NewPerson() 来创建一个新的 Person 对象,并通过其公共方法 SetAge()、GetAge()、SetSal() 和 GetSal() 来访问其属性。

Technologyforgood | 园豆:7541 (大侠五级) | 2023-05-01 22:21

谢谢你的解答。现在不报错了。我也不知道为什么。

支持(0) 反对(0) 绘心人 | 园豆:224 (菜鸟二级) | 2023-05-05 13:46
0

要在 encapsulate 目录下运行

go mod init encapsulate

成功运行的话,会生成一个 go.mod 文件。
这时,就可以像你的代码那样import 本地的包了。

wang_yb | 园豆:4891 (老鸟四级) | 2023-05-02 09:55

试过了。还是不行。爆红。could not import encapsulate/model (no required module provides package "encapsulate/model")。
是不是要在go.mod的文件中写个require的东西,目前我的go.mod文件只有三行
//==go.mod
module encapsulate
require encapsulate/model
go 1.20
还是不行。。。

支持(0) 反对(0) 绘心人 | 园豆:224 (菜鸟二级) | 2023-05-02 16:29

@绘心人: 我的 go.mod 里面应该只有2行

module encapsulate

go 1.19
支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2023-05-02 22:14

@wang_yb: 谢谢你,我现在居然不报错了。我把main包和person包下的go.mod删了,只有encapsulate目录下有一个go.mod。go.mod也是只有两行,现在能运行了。golang真实一门玄学

支持(0) 反对(0) 绘心人 | 园豆:224 (菜鸟二级) | 2023-05-05 13:46

@绘心人: Great!
go.mod 只要工程根目录下有一个就行了

支持(0) 反对(0) wang_yb | 园豆:4891 (老鸟四级) | 2023-05-06 00:31
0

用mod管理,只需一条命令即可解决go mod tidy

Biuget-Golang | 园豆:784 (小虾三级) | 2023-05-06 10:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册