On Sunday, June 21, 2020 at 11:21:29 PM UTC-4, Ian Lance Taylor wrote:
>
> On Sat, Jun 20, 2020 at 7:30 PM T L <tapi...@gmail.com <javascript:>> 
> wrote: 
> > 
> > On Saturday, June 20, 2020 at 4:48:07 PM UTC-4, Ian Lance Taylor wrote: 
> >> 
> >> On Sat, Jun 20, 2020 at 8:26 AM T L <tapi...@gmail.com> wrote: 
> >> > 
> >> > For example, if there is a builtin convertible(from, to) constraint, 
> >> > We can define a slice conversion function as 
> >> > 
> >> > func Convert(type Ta, Tb converitble(Ta, Tb)) (avs []Ta, _Tb) (bvs 
> []Tb) { 
> >> >    bvs = make([]Tb, 0, len(avs) 
> >> >    for _, v := range avs { 
> >> >       bvs = append(bvs, Tb(v)) 
> >> >    } 
> >> >    return bvs 
> >> > } 
> >> > 
> >> > We can use it as: 
> >> > 
> >> > iValues := Convert([]int{}{1, 2, 3}, interface{}(nil)) 
> >> 
> >> 
> https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#no-way-to-express-convertability
>  
> >> 
> >> Ian 
> > 
> > 
> > What are the rationales behind this? 
>
> I'm not sure I understand your question.  The section I mentioned is 
> under "Issues".  There is nothing here that seems to need a rationale. 
> It's an issue that needs to be considered before making a language 
> change proposal. 
>
> Ian 
>

OK, I see.
it would be great if a "convertible" constraint is provided, so that
the example in the first comment of this thread will be possible.
Otherwise, by the current constraint capabilities, a conversion
callback function is needed in declaring and using the generic
slice conversion function, whereas the conversion callback
function is an unnecessary repetitiveness.

Example (by the current rules):

package main

import (
    "fmt"
)

func Convert(type Ta, Tb) (avs []Ta, cb func(Ta) Tb) (bvs []Tb) {
   bvs = make([]Tb, 0, len(avs))
   for _, v := range avs {
      bvs = append(bvs, cb(v))
   }
   return bvs
}

func main() {
    iValues := Convert([]int{1, 2, 3}, func(v int) interface{}{
        return v
    })
    bytes := Convert([]int{1, 2, 3}, func(v int) byte{
        return byte(v)
    })
    bytesSlice := Convert([]string{"abc", "xyz"}, func(v string) []byte{
        return []byte(v)
    })
    
    fmt.Println(iValues...)
    fmt.Println(bytes)
    fmt.Println(bytesSlice)
}

Example (if convertible constraint is supported)

package main

import (
    "fmt"
)

func Convert(type Ta, Tb convertible(Tb, Ta)) (avs []Ta, _ *Tb) (bvs []Tb) {
   bvs = make([]Tb, 0, len(avs))
   for _, v := range avs {
      bvs = append(bvs, Tb(v))
   }
   return bvs
}

func main() {
    iValues := Convert([]int{1, 2, 3}, interface{}(nil))
    bytes := Convert([]int{1, 2, 3}, byte(0))
    bytesSlice := Convert([]string{"abc", "xyz"}, []byte(nil))
    
    fmt.Println(iValues...)
    fmt.Println(bytes)
    fmt.Println(bytesSlice)
}

BTW, if types can be passed to functions as augments, just like the builtin 
new and make functions,
the code will be more clean:

    iValues := Convert([]int{1, 2, 3}, interface{})
    bytes := Convert([]int{1, 2, 3}, byte)
    bytesSlice := Convert([]string{"abc", "xyz"}, []byte)

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/1d34f7fc-69f9-416e-8355-b9bc12a05e7do%40googlegroups.com.

Reply via email to