On Wed, Oct 31, 2018 at 1:32 PM robert engels <reng...@ix.netcom.com> wrote:

> I have argued for a runtime/built-in to do this - it is so common…. (if
> doing “kind of OO” in Go)
>

I would love to have the ability to do it with built-in support, but I feel
like it would go against the goals of not wanting to hide complexity. It
wouldn't be "free" to do it (as far as I know) and I doubt the Go
maintainers want it to hide the copy into the new slice. My 2 cents.


>
>
> On Oct 30, 2018, at 7:30 PM, Justin Israel <justinisr...@gmail.com> wrote:
>
>
>
> On Wed, Oct 31, 2018 at 11:21 AM <zloikom...@gmail.com> wrote:
>
>> Hello, everyone.
>> Consider following code:
>>
>> package main
>> import "fmt"
>>
>> type implementation struct {
>>     d []int}
>>
>> func (impl *implementation) getData() interface{} {
>>     return impl.d}
>>
>> type phase struct{}
>>
>> type data interface {
>>     getData() interface{}}
>>
>> func MakeIntDataPhase() *phase {
>>     return &phase{}}
>>
>> func (p *phase) run(population []data) []data {
>>     return nil}
>>
>> func main() {
>>     var population []implementation
>>     MyPhase := MakeIntDataPhase()
>>     fmt.Println(MyPhase.run(population))
>> }
>>
>>
>> When running following code in playground I got following error: 
>> prog.go:30:25: cannot use population (type []implementation) as type []data 
>> in argument to MyPhase.run
>>
>> If I understand correctly it is because slice of interface type cannot be 
>> converted by the compiler to concrete type.
>>
>>
>> What is correct way in golang to implement functionality that is presented 
>> in the example?
>>
>> When method argument defined using a slice of some interface, how I can pass 
>> it a slice of a concrete type that implements the interface?
>>
>>
> You would end up needing to just do
>
>     func (p *phase) run(population {}interface) []data
>
> and then type assert the {}interface into []implementation
> There isn't a way to directly pass a slice of concrete type to a function
> that accepts a slice of interface, unless you first do this:
>
> iface := make([]data, len(population))
> for i, p := range population {
>     iface[i] = p
> }
> MyPhase.run(iface)
>
> Justin
>
>>
>> --
>> 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