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
}
//===============
从您提供的文件目录结构来看,您需要将 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() 来访问其属性。
谢谢你的解答。现在不报错了。我也不知道为什么。
要在 encapsulate 目录下运行
go mod init encapsulate
成功运行的话,会生成一个 go.mod
文件。
这时,就可以像你的代码那样import 本地的包了。
试过了。还是不行。爆红。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
还是不行。。。
@绘心人: 我的 go.mod 里面应该只有2行
module encapsulate
go 1.19
@wang_yb: 谢谢你,我现在居然不报错了。我把main包和person包下的go.mod删了,只有encapsulate目录下有一个go.mod。go.mod也是只有两行,现在能运行了。golang真实一门玄学
@绘心人: Great!
go.mod 只要工程根目录下有一个就行了
用mod管理,只需一条命令即可解决go mod tidy