You should use interfaces and a “node” type. 

> On Dec 20, 2021, at 12:07 PM, Michael Ellis <michael.f.el...@gmail.com> wrote:
> 
> >Just to be clear, the way I understood you is that you want HtmlTree.C to 
> be a slice which has elements which can each either be a string or an 
> *HtmlTree - i.e. you want these to be mixed in a single slice. Correct?
> 
> Actually, no.  An HtmlTree instance whose content is a string is a terminal 
> node.  The recursion in the Render() func looks like:
> 
>       for _, c := range h.C {
>                 switch c := c.(type) {
>                 case string:
>                         b.WriteString(c)
>                 case *HtmlTree:
>                         err = Render(c, b, rindent)
>                         if err != nil {
>                                 return fmt.Errorf("%s : %v", h.T, err)
>                         }
>                 default:
>                         return fmt.Errorf("Bad content %v. Can't render type 
> %T! ", h.C, c)
>                 }
>         }
> 
> I suppose it's still a problem, though, since the compiler doesn't have any 
> way of knowing that's how trees of HtmlTree meant to be constructed. I should 
> have expressed the intended constraint on HtmlTree.C as `string | 
> []*HtmlTree`.  Does that make a difference?
>> On Monday, December 20, 2021 at 10:25:26 AM UTC-5 axel.wa...@googlemail.com 
>> wrote:
>> Just to be clear, the way I understood you is that you want HtmlTree.C to be 
>> a slice which has elements which can each either be a string or an *HtmlTree 
>> - i.e. you wan these to be mixed in a single slice. Correct?
>> Because that is not a use case for generics, it's a use case for sum types 
>> (which Go does not have).
>> 
>>> On Mon, Dec 20, 2021 at 4:11 PM Michael Ellis <michael...@gmail.com> wrote:
>>> > They can't, sorry.
>>> Ok. Thanks, Axel. 
>>> Saves me wasting more time.  In the past 3 years of using Go, this is the 
>>> only use case where I've  really wanted generics (other cases I've 
>>> encountered so far are easily handled with code generation). 
>> 
>>> -- 
>> 
>>> 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/ac75dc32-733d-4a73-9735-619c33cb4cd4n%40googlegroups.com.
> 
> -- 
> 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/2de22684-0263-465c-8ac0-ff288c535fb7n%40googlegroups.com.

-- 
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/9ABD0D98-6041-4A45-A2C3-D924E298BF16%40ix.netcom.com.

Reply via email to