Go Golang:匿名结构&反思组合

时间:2014-11-21 13:09:38

标签: reflection struct go

在过去2个月内阅读了大约10次的反思定律。用它开发相同的时间,我不得不说它是一种很酷且易于理解的语言......至少在一定程度上。

我作为PHP&的背景Javascript开发人员让我很难理解以下示例:

package main

import(
    "fmt"
    "reflect"
)


func test1(){
    type template struct {
        Title string
        Body  string
    }

    data := []template{
        { Title : "About page", Body : "Body info"},
        { Body : "About page 2 ", Title : "Body info 2"},
    }

    fmt.Println( "-- TEST ONE --" ) 
    fmt.Println( data[0].Title )
}

func test2(){
    data := []struct{
        Title string
        Body  string
    }{
        // Assign with the actual order
        { "About page", "Body info"},
        // Key => Val assignment (Pretty cool)
        { Body : "Body info 2 ", Title : "About page 2"},
    }

    fmt.Println( "-- TEST TWO --" ) 
    fmt.Println( data[1].Title )
}

func test3(){
    type template struct {
        Title string
        Body  string
    }

    Amap := map[string]interface{}{
        "template" : template{},
    }

    w := reflect.ValueOf(Amap["template"])
    x := w.Type()
    y := reflect.TypeOf(w.Interface())
    z := reflect.TypeOf(Amap["template"])

    fmt.Printf("%+v\n", x) // main.template
    fmt.Printf("%+v\n", y) // main.template
    fmt.Printf("%+v\n", z) // main.template

    /*
    var data = struct{
        // none of the above can be place in here.... ( (w|x|y|z) is not a type)
    }{ "About page", "Body info"}
    */

    ww := reflect.New(z)
    xx := ww.Interface()
    tt := reflect.TypeOf(xx)

    /*
    // none of the above can be used this way....
    var data = ww{

    }{ "About page", "Body info"}
    */

    fmt.Println( "-- TEST THREE --" ) 
    fmt.Println( data.Title )
}

func main(){
    test1()
    test2()
    test3()
}

以上示例test1()test2()按预期工作。我想用test3()进一步推动它,但没有成功。我想到让它工作的唯一方法是使用类型开关..

但是既然我正在尝试,我想知道是否:

  1. 有没有办法从反射值中强制转换匿名结构,而不检查正在反映的实际结构
  2. 您能否向我展示test3()
  3. 中两个已注释掉的代码块中的任何一个的工作解决方案

1 个答案:

答案 0 :(得分:3)

  
      
  1. 有没有办法从反射值转换1一个匿名结构而不检查[2]正在反映的实际结构?
  2.   
  1. Go中没有施法。如果你的意思是转换,那么你就错过了谓词:转换为什么?
  2. 类型检查是编译器对程序所做的事情。这句话没有意义。
  3.   
        
    1. 您能否向我展示一个有效的解决方案,来自test3()的两个注释掉的代码块中的任何一个
    2.   

    这很简单,只需写:

    var data = struct{string, string}{"About page", "Body info"}
    

    如果你想在运行时构建/创建/组装结构类型,我将不得不让你失望;那是不可能的。

    编辑(2015年2月11日):通过反射在运行时构建结构类型(以及数组,函数和接口)being implemented