跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教一个 golang 中 reflect 的问题, 琢磨了一下午了
未分類
8 11 月 2020

请教一个 golang 中 reflect 的问题, 琢磨了一下午了

请教一个 golang 中 reflect 的问题, 琢磨了一下午了

資深大佬 : Vibra 8

package main  import (     "fmt"     "reflect" )  type arrT struct {     Arr []int }   func main() {  tt := arrT{   Arr: []int{1, 2},  }   arrValue := reflect.ValueOf(&tt).Elem().FieldByName("Arr")  fmt.Printf("%v, %Tn", arrValue, arrValue)   aValue := arrValue.Elem()  aValue.Set(reflect.Append(aValue, reflect.ValueOf(80)))  // panic: reflect: call of reflect.Value.Elem on slice Value      fmt.Println("Slice after appending data:", tt) } 

如代码所示

一个结构体中有一个 split 我想在里面添加一些东西, 但是一直报错, 怎样才能顺利添加进去呢?

大佬有話說 (21)

  • 資深大佬 : emeab

    报啥错啊

  • 主 資深大佬 : Vibra

    @emeab 错误写在了代码中了 `panic: reflect: call of reflect.Value.Elem on slice Value`

  • 資深大佬 : impl

    Go 圣经没看过?少用 reflect 和 unsafe 这两个包

  • 資深大佬 : suke971219

    使用 .([]int) 推算类型,修改切片试试吧

  • 主 資深大佬 : Vibra

    @impl 主要是自己对 golang 不是很熟悉,一熟悉一下语法, 二是有点代码洁癖吧 reflect 节省了大量的重复代码

  • 主 資深大佬 : Vibra

    @suke971219 这个修改不到原本的切片呀, 我现在已经修改好了, 谢谢. 代码附上供大家参考
    “`golang

    func main() {
    tt := arrT{
    Arr: []int{1, 2},
    }

    arrValue := reflect.ValueOf(&tt).Elem().FieldByName(“Arr”)
    fmt.Printf(“%v, %Tn”, arrValue, arrValue)

    arrValue.Set(reflect.Append(arrValue, reflect.ValueOf(80)))

    fmt.Println(“Slice after appending data:”, tt.Arr)
    }
    “`

  • 資深大佬 : mason961125

    建议阅读 https://blog.golang.org/laws-of-reflection

  • 資深大佬 : merin96

    这玩意慢得很,小心使用

  • 資深大佬 : BBCCBB

    这报错应该是 aValue := arrValue.Elem() 这一行的数据,

    arrValue := reflect.ValueOf(&tt).Elem().FieldByName(“Arr”) 你在这里已经调用过 Elem()了, 获取到的就是 slice 了, slice 没法再 elem()了.

  • 資深大佬 : CEBBCAT

    @impl 少用又不是不能用,现在就是要解决用得不好的问题。就像人家在尝试使用 goto 解决跳出循环的问题时,旁人插一嘴 goto 是毒药,不能用,这不是搞笑呢吗?

  • 資深大佬 : useben

    一堆人都不知道说什么…

    reflect.ValueOf(&tt).Elem() 这里已经对对象指针相当于解引用了, 已经拿到对象值信息, aValue := arrValue.Elem() 这里没必要再用 Elem() , 修改为一下即可

    “`go
    package main

    import (
    “fmt”
    “reflect”
    )

    type arrT struct {
    Arr []int
    }

    func main() {
    tt := arrT{
    Arr: []int{1, 2},
    }

    arrValue := reflect.ValueOf(&tt).Elem().FieldByName(“Arr”)
    fmt.Printf(“%v, %Tn”, arrValue, arrValue)

    aValue := arrValue
    aValue.Set(reflect.Append(aValue, reflect.ValueOf(80)))

    fmt.Println(“Slice after appending data:”, tt)
    }
    “`

  • 資深大佬 : GopherDaily

    @Vibra 对

  • 資深大佬 : impl

    @CEBBCAT 我说不能用了吗?要不回去学校找体育老师教你语文?

  • 資深大佬 : dimlau

    @impl

    1 、顶作者没说要多用 reflect 和 unsafe 这两个包,只是在使用时遇到了具体问题希望探讨。
    —> 而妳回复说 Go 圣经主张少用;

    2 、 @CEBBCAT 反驳妳说「少用又不是不能用」,意思是会尽量少用但是在用的时候遇到问题还是要解决啊。
    —> 而妳回复说「我说不能用了吗?」。

    似乎这两次互动都是妳(不知是否故意地)理解错了别人的意思,为什么还要让别人回学校学语文呢?

  • 資深大佬 : impl

    @dimlau 看看他举的 goto 例子

  • 資深大佬 : no1xsyzy

    @impl 那我问你:你在 #3 说少用的目的是什么?对主的问题有何建树?
    猜想的可能:
    1. 你认为这个问题可以更优雅地实现,不需要 reflect,那你 #13 的回复就显得非常诡异。
    2. 你说的话与主题根本无关

    你要纠结自句,那 #10 把 “不能用” 改成 “少用” 不是一样的吗?
    那咱重新再来一遍?

    少用又不是不能用,现在就是要解决用得不好的问题。就像人家在尝试使用 goto 解决跳出循环的问题时,旁人插一嘴 goto 是毒药,少用,这不是搞笑呢吗?

  • 資深大佬 : no1xsyzy

    @no1xsyzy 自句 -> 字句

  • 資深大佬 : impl

    @no1xsyzy 那你的建议就是一个 go 初学者浪费一个下午时间琢磨怎么用 reflect 这个包咯?

  • 資深大佬 : lxz6597863

    “`go
    package main

    import (
    “fmt”
    “reflect”
    )

    type arrT struct {
    Arr []int
    }

    func main() {
    tt := arrT{
    Arr: []int{1, 2},
    }

    arrValue := reflect.ValueOf(&tt).Elem().FieldByName(“Arr”)
    fmt.Printf(“%v, %Tn”, arrValue, arrValue)

    arrValue.Set(reflect.Append(arrValue, reflect.ValueOf(80)))
    // panic: reflect: call of reflect.Value.Elem on slice Value

    fmt.Println(“Slice after appending data:”, tt)
    }
    “`

  • 資深大佬 : 2435043xia

    上正解

  • 資深大佬 : no1xsyzy

    @impl 我感觉你纯粹是不会说话,或者心态崩了
    “我建议先考虑不用 reflect 解决问题。另外,主可以把原本的问题问出来,以避免这是个潜在的 X-Y 问题”
    这是否正确表达了你的意图?同时,这样一段话又能显得说话人温和谦虚且博学。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具