如何在Go中将结构作为参数传递给导入的函数?

问题描述

我已经在我的 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

我的问题

将结构实例作为参数传递给Go中导入的函数的正确方法是什么?

解决方法

问题是您有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