Reflection on slice of pointers












2















I am trying to reflect a slice of pointers on a struct stored in an interface{}



I think I am doing ok until it's time to introspect the content on the pointed struct.
See the below example



package main

import (
"fmt"
"reflect"
)

type teststruct struct {
prop1 string
prop2 string
}

func main() {
test := teststruct{"test", "12"}

var container interface{}

var testcontainer *teststruct

testcontainer = append(testcontainer, &test)

container = testcontainer

rcontainer := reflect.ValueOf(container)
fmt.Println(rcontainer.Kind())

rtest := rcontainer.Index(0).Elem()
fmt.Println(rtest)

rteststruct := reflect.ValueOf(rtest)
fmt.Println(rteststruct.Kind())

typeOfT := rteststruct.Type()

for i := 0; i < rteststruct.NumField(); i++ {
f := rteststruct.Field(i)
fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
}
}


Which results



slice
{test 12}
struct
0: typ *reflect.rtype = <*reflect.rtype Value>
1: ptr unsafe.Pointer = <unsafe.Pointer Value>
2: flag reflect.flag = <reflect.flag Value>


I am definitely missing something here, someone would be able to explain me what ?










share|improve this question





























    2















    I am trying to reflect a slice of pointers on a struct stored in an interface{}



    I think I am doing ok until it's time to introspect the content on the pointed struct.
    See the below example



    package main

    import (
    "fmt"
    "reflect"
    )

    type teststruct struct {
    prop1 string
    prop2 string
    }

    func main() {
    test := teststruct{"test", "12"}

    var container interface{}

    var testcontainer *teststruct

    testcontainer = append(testcontainer, &test)

    container = testcontainer

    rcontainer := reflect.ValueOf(container)
    fmt.Println(rcontainer.Kind())

    rtest := rcontainer.Index(0).Elem()
    fmt.Println(rtest)

    rteststruct := reflect.ValueOf(rtest)
    fmt.Println(rteststruct.Kind())

    typeOfT := rteststruct.Type()

    for i := 0; i < rteststruct.NumField(); i++ {
    f := rteststruct.Field(i)
    fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
    }
    }


    Which results



    slice
    {test 12}
    struct
    0: typ *reflect.rtype = <*reflect.rtype Value>
    1: ptr unsafe.Pointer = <unsafe.Pointer Value>
    2: flag reflect.flag = <reflect.flag Value>


    I am definitely missing something here, someone would be able to explain me what ?










    share|improve this question



























      2












      2








      2








      I am trying to reflect a slice of pointers on a struct stored in an interface{}



      I think I am doing ok until it's time to introspect the content on the pointed struct.
      See the below example



      package main

      import (
      "fmt"
      "reflect"
      )

      type teststruct struct {
      prop1 string
      prop2 string
      }

      func main() {
      test := teststruct{"test", "12"}

      var container interface{}

      var testcontainer *teststruct

      testcontainer = append(testcontainer, &test)

      container = testcontainer

      rcontainer := reflect.ValueOf(container)
      fmt.Println(rcontainer.Kind())

      rtest := rcontainer.Index(0).Elem()
      fmt.Println(rtest)

      rteststruct := reflect.ValueOf(rtest)
      fmt.Println(rteststruct.Kind())

      typeOfT := rteststruct.Type()

      for i := 0; i < rteststruct.NumField(); i++ {
      f := rteststruct.Field(i)
      fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
      }
      }


      Which results



      slice
      {test 12}
      struct
      0: typ *reflect.rtype = <*reflect.rtype Value>
      1: ptr unsafe.Pointer = <unsafe.Pointer Value>
      2: flag reflect.flag = <reflect.flag Value>


      I am definitely missing something here, someone would be able to explain me what ?










      share|improve this question
















      I am trying to reflect a slice of pointers on a struct stored in an interface{}



      I think I am doing ok until it's time to introspect the content on the pointed struct.
      See the below example



      package main

      import (
      "fmt"
      "reflect"
      )

      type teststruct struct {
      prop1 string
      prop2 string
      }

      func main() {
      test := teststruct{"test", "12"}

      var container interface{}

      var testcontainer *teststruct

      testcontainer = append(testcontainer, &test)

      container = testcontainer

      rcontainer := reflect.ValueOf(container)
      fmt.Println(rcontainer.Kind())

      rtest := rcontainer.Index(0).Elem()
      fmt.Println(rtest)

      rteststruct := reflect.ValueOf(rtest)
      fmt.Println(rteststruct.Kind())

      typeOfT := rteststruct.Type()

      for i := 0; i < rteststruct.NumField(); i++ {
      f := rteststruct.Field(i)
      fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
      }
      }


      Which results



      slice
      {test 12}
      struct
      0: typ *reflect.rtype = <*reflect.rtype Value>
      1: ptr unsafe.Pointer = <unsafe.Pointer Value>
      2: flag reflect.flag = <reflect.flag Value>


      I am definitely missing something here, someone would be able to explain me what ?







      pointers go reflection slice






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 '18 at 7:44









      Flimzy

      38.3k96597




      38.3k96597










      asked Nov 23 '18 at 1:36









      Riwi KumabeRiwi Kumabe

      132




      132
























          1 Answer
          1






          active

          oldest

          votes


















          1














          rtest := rcontainer.Index(0).Elem() is already the value, so when you do this: rteststruct := reflect.ValueOf(rtest), you are actually getting a reflect.Value which is of course a struct.



          Replace the end of your code with this:



          typeOfT := rtest.Type()

          for i := 0; i < rtest.NumField(); i++ {
          f := rtest.Field(i)
          fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
          }


          Playground






          share|improve this answer
























          • Thank you for your help, I see now, my understanding of Elem() was wrong.

            – Riwi Kumabe
            Nov 23 '18 at 2:56











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439713%2freflection-on-slice-of-pointers%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          rtest := rcontainer.Index(0).Elem() is already the value, so when you do this: rteststruct := reflect.ValueOf(rtest), you are actually getting a reflect.Value which is of course a struct.



          Replace the end of your code with this:



          typeOfT := rtest.Type()

          for i := 0; i < rtest.NumField(); i++ {
          f := rtest.Field(i)
          fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
          }


          Playground






          share|improve this answer
























          • Thank you for your help, I see now, my understanding of Elem() was wrong.

            – Riwi Kumabe
            Nov 23 '18 at 2:56
















          1














          rtest := rcontainer.Index(0).Elem() is already the value, so when you do this: rteststruct := reflect.ValueOf(rtest), you are actually getting a reflect.Value which is of course a struct.



          Replace the end of your code with this:



          typeOfT := rtest.Type()

          for i := 0; i < rtest.NumField(); i++ {
          f := rtest.Field(i)
          fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
          }


          Playground






          share|improve this answer
























          • Thank you for your help, I see now, my understanding of Elem() was wrong.

            – Riwi Kumabe
            Nov 23 '18 at 2:56














          1












          1








          1







          rtest := rcontainer.Index(0).Elem() is already the value, so when you do this: rteststruct := reflect.ValueOf(rtest), you are actually getting a reflect.Value which is of course a struct.



          Replace the end of your code with this:



          typeOfT := rtest.Type()

          for i := 0; i < rtest.NumField(); i++ {
          f := rtest.Field(i)
          fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
          }


          Playground






          share|improve this answer













          rtest := rcontainer.Index(0).Elem() is already the value, so when you do this: rteststruct := reflect.ValueOf(rtest), you are actually getting a reflect.Value which is of course a struct.



          Replace the end of your code with this:



          typeOfT := rtest.Type()

          for i := 0; i < rtest.NumField(); i++ {
          f := rtest.Field(i)
          fmt.Printf("%d: %s %s = %vn", i, typeOfT.Field(i).Name, f.Type(), f.String())
          }


          Playground







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 23 '18 at 2:49









          ssemillassemilla

          3,087424




          3,087424













          • Thank you for your help, I see now, my understanding of Elem() was wrong.

            – Riwi Kumabe
            Nov 23 '18 at 2:56



















          • Thank you for your help, I see now, my understanding of Elem() was wrong.

            – Riwi Kumabe
            Nov 23 '18 at 2:56

















          Thank you for your help, I see now, my understanding of Elem() was wrong.

          – Riwi Kumabe
          Nov 23 '18 at 2:56





          Thank you for your help, I see now, my understanding of Elem() was wrong.

          – Riwi Kumabe
          Nov 23 '18 at 2:56


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439713%2freflection-on-slice-of-pointers%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen