Go 如何将结构作为参数传递给函数?
如何在golang中将结构作为参数传递给函数?这是我的代码:Go 如何将结构作为参数传递给函数?,go,Go,如何在golang中将结构作为参数传递给函数?这是我的代码: package main import ( "fmt" ) type MyClass struct { Name string } func test(class interface{}) { fmt.Println(class.Name) } func main() { test(MyClass{Name: "Jhon"}) } 当我运行它时,我得到
package main
import (
"fmt"
)
type MyClass struct {
Name string
}
func test(class interface{}) {
fmt.Println(class.Name)
}
func main() {
test(MyClass{Name: "Jhon"})
}
当我运行它时,我得到了这样一个错误
# command-line-arguments
/tmp/sandbox290239038/main.go:12: class.Name undefined (type interface {} has no field or method Name)
有play.golang.org地址。您正在寻找
func test(class MyClass) {
fmt.Println(class.Name)
}
目前,该方法将类
识别为实现空接口的某个对象(这意味着在该范围内,它的字段和方法完全未知),这就是产生错误的原因
你的另一个选择是这样的
func test(class interface{}) {
if c, ok := class.(MyClass); ok { // type assert on it
fmt.Println(c.Name)
}
}
但是没有理由在你的例子中这样做。只有当您要进行类型切换或有多个代码路径根据
类的实际类型执行不同的操作时,才有意义。根据您的需要,您(至少)有两个选项:
结构类型上的方法
以结构类型为参数的Func
我相信其他人可能会提供一些我忘记的界面向导。请查看调试,接收方法。它使用stuct user及其方法
主程序包
输入“fmt”
//用户在程序中定义一个用户。
类型用户结构{
名称字符串
电子邮件字符串
状态字符串
}
func调试(u用户){
fmt.Printf(“%+v\n”,u)
}
//notify使用值接收器实现一个方法。
func(u用户)notify(){
fmt.Printf(“用户:将用户电子邮件发送到%s\n”,u.name,u.Email)
}
//changeEmail实现了一个带有指针接收器的方法。
func(u*用户)更改电子邮件(电子邮件字符串){
u、 电子邮件=电子邮件
}
func(u*用户)更改名称(名称字符串){
u、 name=name
}
func(u*用户)Send(){
u、 通知()
}
//main是应用程序的入口点。
func main(){
//类型为user的指针也可用于方法
//使用值接收器声明。
约翰:=&用户{“约翰”john@exemple.com“,“已启用”}
john.changeName(“约翰·史密斯”)
约翰。更改电子邮件(“john@gmail.com")
约翰通知
接待(约翰)
调试(用户{“Willy”,”Willy@exemple.com“,”已启用“})
}
func接收(用户界面{
更改名称(s字符串)
更改电子邮件(s字符串)
发送()
}) {
user.changeName(“账单”)
user.changemail(“bill@billy-(example.com)
user.Send()
}
如果您真的想发送任何结构,就像在原始问题中写的一样(一个空的接口参数),以便可以访问AnyStruct.SomeField和AnotherStruct.SomeField,或AnyOtherStruct.AnyField,那么go的反射功能就是最好的选择
例如,如果查看JSON封送处理函数,它几乎接受任何结构作为(“v”)参数发送到具有空接口参数的函数。然后,封送处理函数最终调用
e.reflectValue(reflect.ValueOf(v), opts)
但您可能正在寻找其他答案所建议的简单方法,不需要高级反射(一种通用的编程方式)
不过,我会发布这个答案,以防其他读者对发送结构感兴趣,而不需要预先知道结构字段是什么
JSON解析器需要一般性访问结构的原因是为了方便用户定义他想要的任何结构,然后自动计算出结构并将其映射到JSON语法。你可以想象100种不同的结构布局,你只想把它们放在一个文本文件中,而不需要事先知道所有的结构布局——函数可以在运行时计算出来,这就是反射的工作方式(其他语言称之为运行时类型信息、元编程等).您需要使用()
语法将参数从接口强制转换为特定结构
主程序包
进口(
“fmt”
)
类型MyClass结构{
名称字符串
}
func测试(类接口{}){
classStr:=类。(MyClass)
fmt.Println(classStr.Name)
}
func main(){
测试(MyClass{Name:“Jhon”})
}
我尝试了结构的第二个代码段,但当func接受接口{}时,我不能简单地传入我的结构,那么如何为func传递正确的参数?我们可以不断言就这样做吗?所以它是receive动态结构。@Angger您不必做类型断言,如果您知道接口提供了什么方法,您可以只调用一个。如果传入类型提供的方法集不同,并且您需要根据传入的类型执行特定操作,则将使用类型断言。直到您可以从类型断言中获取ok第二个参数。谢谢:DNow另外,我想添加一个接口,它保存所有函数/方法的列表。我们将如何实现这一点?你能详细阐述一下@AmulyaKashyap吗?描述你的目标是什么。
e.reflectValue(reflect.ValueOf(v), opts)