On 1 August 2017 at 13:57, Josh Humphries <jh...@bluegosling.com> wrote:
> Although that solution creates a heap-allocated tmp for every element in the
> slice. Using an interface, the value will be inlined instead of
> heap-allocated if it fits without boxing (so most primitive types and
> pointer types won't need heap allocation).

As it happens, it's the other way round - the solution using Interface can
make an allocation per element, but the solution using Value does not.

https://play.golang.org/p/Q0VHbfL7Ij

Additionally, the solution using Interface can lose the type information
in some cases and panic as a result.

https://play.golang.org/p/WocF9CaPoR

  cheers,
    rog.


>
> ----
> Josh Humphries
> jh...@bluegosling.com
>
> On Tue, Aug 1, 2017 at 7:29 AM, roger peppe <rogpe...@gmail.com> wrote:
>>
>> FWIW, you don't have to use Interface to do the swap:
>>
>> https://play.golang.org/p/O8lGJGGOXP
>>
>> On 31 July 2017 at 15:18, eZio Pan <eziopa...@gmail.com> wrote:
>> > Hello,
>> > I want to build a "universal slice reverser" with reflect.MakeFunc. But
>> > I
>> > don't know how to get a copy of reflect.Value's underlying value, which
>> > make
>> > result not correct.
>> >
>> > Here is the code:
>> >
>> > package main
>> >
>> > import (
>> > "fmt"
>> > "reflect"
>> > )
>> >
>> > func reverse(in []reflect.Value) (out []reflect.Value) {
>> > inls := in[0]
>> > inlslen := inls.Len()
>> >
>> > for i, j := 0, inlslen-1; i < j; i, j = i+1, j-1 {
>> > a := inls.Index(i)
>> > b := inls.Index(j)
>> > // how to get underlying value of a and b ?
>> > a.Set(b)
>> > b.Set(a)
>> > }
>> > return in
>> > }
>> >
>> > var intFlipper func([]int) []int
>> >
>> > func main() {
>> > emptyFunc := reflect.ValueOf(&intFlipper).Elem()
>> > pseudoFunc := reflect.MakeFunc(emptyFunc.Type(), reverse)
>> > emptyFunc.Set(pseudoFunc)
>> > fmt.Printf("%v\n", intFlipper([]int{2, 3, 4, 5, 6, 7}))
>> > }
>> >
>> > My code return [7 6 5 5 6 7], but excepting result is [7 6 5 4 3 2]
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "golang-nuts" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to golang-nuts+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to golang-nuts+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to