On Thu, Mar 10, 2022 at 1:40 PM 'wagner riffel' via golang-nuts < golang-nuts@googlegroups.com> wrote:
> I don't think it's mentioned in the specification, my bet is that > unless your type requires inifnity amout of memory (eg: `type t struct > {t}`) or the type is an interface and break its rules, (eg: `type > iface interface{ iface }`) you can use self-reference. The validity of `type T *T` in Go is based on two things: 1) The visibility of the identifier in `type T ...` is specified to start right after the identifier, 2) It's possible, in this case, to compute the size of type T. So no problem here. > You're correct, C doesn't allow self reference in type decl, more ... In `typedef self *self;` the visibility of the second instance of identifier `self` starts only after it, ie. preceding the final `;'. So the first identifier `self`, the one after `typedef` is undefined and that's the real reason it does not work. However: ---- jnml@e5-1650:~/tmp$ cat main.c typedef int T; typedef T T; int main() {} jnml@e5-1650:~/tmp$ gcc -Wall main.c jnml@e5-1650:~/tmp$ ---- This works because typedef is equal to Go type aliases. But the full Go thing cannot work: ---- jnml@e5-1650:~/tmp$ cat main.c typedef int T; typedef T *T; int main() {} jnml@e5-1650:~/tmp$ gcc -Wall main.c main.c:2:12: error: conflicting types for âTâ 2 | typedef T *T; | ^ main.c:1:13: note: previous declaration of âTâ was here 1 | typedef int T; | ---- Here the problem is that we define T to be two different types, the first it's an int and the second is a pointer to int. -- 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/CAA40n-VotEGgVupaJ6S1zRF%3D3hDHDKAz0V5_enaD9EfYfL7t-Q%40mail.gmail.com.