Thank you! I've now switched to using any as you suggested & also use 
strings.Builder.

On Wednesday, November 9, 2022 at 4:33:48 PM UTC dun...@harris3.org wrote:

> > Interestingly, I couldn't put the asStr() code in the String() function 
> since doing so produced this error:
> > 
> > invalid operation: cannot use type assertion on type parameter value 
> element (variable of type T constrained by comparable)
>
> You need to convert to "any": https://go.dev/play/p/1pMhs22S-8P
>
> P.S. It would be better to use https://pkg.go.dev/strings#Builder for 
> building a string
>
> On Tuesday, 8 November 2022 at 13:09:51 UTC Mark wrote:
>
>> Thanks for your help and very interesting ideas. In the end I used this:
>>
>> type Set[T comparable] map[T]struct{}
>>
>> func New[T comparable](elements ...T) Set[T] {
>>     set := make(Set[T], len(elements))
>>     for _, element := range elements {
>>         set[element] = struct{}{}
>>     }
>>     return set
>> }
>>
>> func (me Set[T]) String() string {
>>     elements := make([]T, 0, len(me))
>>     for element := range me {
>>         elements = append(elements, element)
>>     }
>>     sort.Slice(elements, func(i, j int) bool {
>>         return less(elements[i], elements[j])
>>     })
>>     s := "{"
>>     sep := ""
>>     for _, element := range elements {
>>         s += sep + asStr(element)
>>
>>         sep = " "
>>     }
>>     return s + "}"
>> }
>>
>> func asStr(x any) string {
>>     if s, ok := x.(string); ok {
>>         return fmt.Sprintf("%q", s)
>>     }
>>     return fmt.Sprintf("%v", x)
>> }
>>
>> func less(a, b any) bool {
>>     switch x := a.(type) {
>>     case int:
>>         return x < b.(int)
>>     case float64:
>>         return x < b.(float64)
>>     case string:
>>         return x < b.(string)
>>     default:
>>         return fmt.Sprintf("%v", a) < fmt.Sprintf("%v", b)
>>     }
>> }
>>
>> Interestingly, I couldn't put the asStr() code in the String() function 
>> since doing so produced this error:
>>
>> invalid operation: cannot use type assertion on type parameter value 
>> element (variable of type T constrained by comparable)
>>
>> Anyway, I'm happy that it all works now. (I know I ought to include every 
>> int & float32, but this is enough for now).
>>
>>
>>
>> On Tuesday, November 8, 2022 at 11:29:34 AM UTC rog wrote:
>>
>>> If you're sure that T is an int or a string, then why not constrain it 
>>> as such? https://go.dev/play/p/1kT6EacMHco
>>>
>>> You could go further and constrain it to allow any type with ordering 
>>> defined: https://go.dev/play/p/il5koj1RPkh
>>>
>>> If you want to allow any kind of comparable key in your set, one could 
>>> observe that essentially you're trying to solve the same problem that the 
>>> fmt package is solving when it converts maps to string. It uses the 
>>> internal fmtsort <https://pkg.go.dev/internal/fmtsort> package, which, 
>>> as luck would have it, has been factored out into an externally 
>>> available package 
>>> <https://pkg.go.dev/github.com/rogpeppe/go-internal/fmtsort>. So you 
>>> could do this: https://go.dev/play/p/oKTGSm_o22a
>>>
>>> To answer the specific question you asked, there is an issue that tracks 
>>> the ability to do a switch directly on a type parameter: 
>>> https://github.com/golang/go/issues/45380
>>>
>>> But you can also work around the lack of that feature by doing something 
>>> like this: https://go.dev/play/p/3C2a61Ojbxs
>>>
>>> Hope this helps,
>>>
>>>   rog.
>>>
>>>
>>> On Tue, 8 Nov 2022 at 08:53, 'Mark' via golang-nuts <
>>> golan...@googlegroups.com> wrote:
>>>
>>>> Given a function:
>>>>
>>>> func F[T comparable](a T) {
>>>> }
>>>>
>>>> is it possible to check T's type inside F?
>>>>
>>>> My use case is that I have a function with signature G[T comparable](x 
>>>> []T) and inside G I want to sort the elements in slice x where T could be 
>>>> int or string.
>>>>
>>>> This arises in a tiny generic set module I've created: 
>>>> https://github.com/mark-summerfield/gset
>>>> In the String() method I want to return a string with the elements 
>>>> sorted (for human readability and for testing convenience); but at the 
>>>> moment I can only do this by converting all elements to strings and 
>>>> sorting 
>>>> them which isn't good for ints.
>>>>
>>>> -- 
>>>> 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...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/e746f065-24fa-474a-90ec-2d8367bf3e3bn%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/golang-nuts/e746f065-24fa-474a-90ec-2d8367bf3e3bn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>

-- 
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/fc707f5e-0f80-4224-9532-b97ad3a9eea5n%40googlegroups.com.

Reply via email to