我怎样才能将结果传递给go lang中的参数

时间:2015-04-22 18:04:21

标签: go

如何在go lang

中将struct传递给函数作为参数

有我的代码;

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.google.com fiddle地址

5 个答案:

答案 0 :(得分:18)

你正在寻找;

func test(class MyClass) {
    fmt.Println(class.Name)
}

根据情况,该方法将class识别为实现空接口的某个对象(意味着该范围内的字段和方法完全未知),这就是您收到错误的原因。

您的其他选择是这样的;

func test(class interface{}) {
     if c, ok := class.(MyClass); ok { // type assert on it    
         fmt.Println(c.Name)
     }
}

但在你的例子中没有理由。只有你要进行类型切换或者有多个代码路径根据class的实际类型执行不同的操作时才有意义。

答案 1 :(得分:7)

根据您的需要,您(至少)有两个选择:

  1. 结构类型的方法
  2. 将struct type作为参数
  3. 的Func
    package main
    
    import "fmt"
    
    type MyClass struct {
        Name string
    }
    
    func main() {
        cls := MyClass{Name: "Jhon"}
    
        // Both calls below produce same result
        cls.StructMethod()  // "Jhon"
        FuncPassStruct(cls) // "Jhon"
    }
    
    // Method on struct type
    func (class MyClass) StructMethod() {
        fmt.Println(class.Name)
    }
    
    // Function that takes struct type as the parameter
    func FuncPassStruct(class MyClass) {
        fmt.Println(class.Name)
    }
    

    我确信其他人可能会提供一些我忘记的界面魔法。

答案 2 :(得分:1)

请查看调试接收方法。它使用stuct用户及其方法。 https://play.golang.org/p/E_WkLWGdeB

    func Receive(user interface{changeName(s string); changeEmail(s string); Send() }){
        user.changeName("Bill")
        user.changeEmail("bill@billy-exemple.com")
        user.Send()
    }

debug(用户{" Willy"," Willy@exemple.com","已启用"})         }

int[][] twoDArray = new int[3][3];

答案 3 :(得分:0)

如果你真的想要发送任何结构,就像它在原始问题(空接口参数)中写的那样,以便可以访问AnyStruct.SomeField和AnotherStruct.SomeField,或AnyOtherStruct.AnyField,AFAIK的反射功能去吧是要走的路。

例如,如果您查看JSON编组函数,它几乎接受任何结构作为(“v”)参数发送到具有空接口参数的函数。然后那个编组函数最终调用

e.reflectValue(reflect.ValueOf(v), opts)

但你可能正在寻找其他答案所提出的简单的东西,这不需要高级反思(一种通用的编程方式)

但是我发布这个答案,以防其他读者有兴趣发送结构,而不需要事先知道结构字段是什么。

JSON解析器需要一般性地访问结构的原因是为了方便用户定义他想要的任何结构,然后Go自动计算出结构并将其映射到JSON语法。您可以想象100个不同的结构布局,您只想放置到文本文件中,而不必事先了解所有结构布局 - 该函数可以在运行时找出它,这是反射的工作原理(其他语言称之为运行时类型)信息,元编程等。)

答案 4 :(得分:0)

您需要使用package main import ( "fmt" ) type MyClass struct { Name string } func test(class interface{}) { classStr := class.(MyClass) fmt.Println(classStr.Name) } func main() { test(MyClass{Name: "Jhon"}) } 语法将参数从接口强制转换为特定的结构

Reader