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