如何从用作泛型的接口访问结构属性

也许我只是让我的代码变得过于复杂,但我正在努力更好地理解接口和结构在 golang 中的工作方式。


基本上,我将满足接口 I 的元素存储在哈希表中。由于所有满足 I 的项目都可以包含在 I 元素中,我想我可以将 I 用作一种“通用”接口,将它们填充到哈希图中,然后稍后将它们拉出并访问“underlyng”结构方法从那里。


不幸的是,在拉出元素后,我发现我无法调用结构方法,因为元素是接口类型,并且“原始”结构不再可访问。


有没有一种方法可以干净简单地访问满足我的结构?


这是我的代码,它在 for 循环中抛出一个“value.name undefined (type I has no field or method name)”:


/**

 * Define the interface

 */

type I interface{

    test()

}


/**

 * Define the struct

 */

type S struct{

    name string

}


/**

 *  S now implements the I interface

 */

func (s S) test(){}


func main(){


    /**

     * Declare and initialize s S

     */

    s := S{name:"testName"}


    /**

     * Create hash table

     * It CAN contains S types as they satisfy I interface

     * Assign and index to s S

     */

    testMap := make(map[string]I)

    testMap["testIndex"] = s


    /**

     * Test the map length

     */

    fmt.Printf("Test map length: %d\r\n", len(testMap))


    for _, value := range testMap{


        /**

         * This is where the error is thrown, value is of Interface type, and it is not aware of any "name" property

         */

        fmt.Printf("map element name: %s\r\n", value.name)

    }


}


慕神8447489
浏览 109回答 3
3回答

隔江千里

您应该向您的界面添加一个访问器:type I interface {    test()    Name() string}然后确保你的结构实现了这个方法:func (s S) Name() string {    return s.name}然后使用访问器方法访问名称:        fmt.Printf("map element name: %s\r\n", value.Name())

千万里不及你

我认为你需要的是type swithes在旅途中您可以访问底层结构,如下所示:

慕姐4208626

for _, value := range testMap {    switch v := value.(type) {    case S:        fmt.Printf("map element name: %s\r\n", v.name)        // TODO: add other types here    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go