问题描述
我已经在我的 main.go 文件中定义并创建了一个结构实例。我想使用我的struct实例作为参数从 functions / functions.go 文件调用一个函数
package main
import (
"./functions"
)
type person struct {
name string
age int
}
func main() {
person1 := person{"James",24}
functions.Hello(person1)
}
main.go
package functions
import "fmt"
type person struct {
name string
age int
}
func Hello(p person) {
fmt.Println(p.name,"is",p.age,"years old")
}
functions / functions.go
当我使用go run main.go
运行此代码时,出现错误:main.go:16:17: cannot use person1 (type person) as type functions.person in argument to functions.Hello
我的问题
解决方法
问题是您有2个单独的person
定义。与其在main中重新声明它,不如在包function
中使用它。
package functions
import "fmt"
type Person struct {
Name string
Age int
}
func Hello(p Person) {
fmt.Println(p.name,"is",p.age,"years old")
}
已将Person更改为大写字母,并且在字段中将其导出。
package main
import (
"./functions"
)
func main() {
person1 := functions.Person{"James",24}
functions.Hello(person1)
}
,
您要定义两种不同的结构类型(具有相同的字段,但有所不同)-其中一种是person
,另一种称为functions.person
。
在这种情况下,正确的方法是像这样在functions/functions.go
中定义您的结构:
package functions
import "fmt"
// Use uppercase names to export struct and fields (export == public)
type Person struct {
Name string
Age int
}
func Hello(p Person) {
fmt.Println(p.Name,p.Age,"years old")
}
现在在main.go
中,您可以导入包functions
并访问其导出/公共结构:
package main
import (
"./functions"
)
// No need to redeclare the struct,it's already defined in the imported package
func main() {
// create an object of struct Person from the functions package. Since its fields are public,we can set them here
person1 := functions.Person{"James",24}
// call the Hello method from the functions package with an object of type functions.Person
functions.Hello(person1)
}
关键要点是,用相同名称定义的结构即使看起来很相似也不会自动相同-毕竟它们的定义不同。
如果两个结构具有相同的字段,也可以进行类型转换,但这是different story。