> My use case is that I want to pretty print in-memory objects for debug 
purposes during testing, and one of the features would be to point out such 
cycles as this.

Consider using an existing library for this, for example:
  https://github.com/sanity-io/litter
  https://github.com/davecgh/go-spew

On Wednesday, November 11, 2020 at 1:59:18 PM UTC+1 arpad....@gmail.com 
wrote:

> `l[0] = l` would be fine for me, indeed. Though I am not sure I understand 
> the suggested solution. Notice that the type of the slice is 
> `[]interface{}`. This...
>
> ll := l[0].([]interface{})
> println(&l == &ll)
>
> ...would print `false`.
>
> I think the main challenge is that l and ll, or l[0] for that matter, are 
> not the same values. I tried with reflection, too, but couldn't figure a 
> way.
>
> PS: I am quite aware how unearthy this problem is, and how it should not 
> ever happen in case of actual programs. My use case is that I want to 
> pretty print in-memory objects for debug purposes during testing, and one 
> of the features would be to point out such cycles as this.
>
>
> On Wednesday, November 11, 2020 at 8:13:55 AM UTC+1 
> axel.wa...@googlemail.com wrote:
>
>> The question was about detecting cyclic references. For that, the `l[0] = 
>> l` case is enough.
>>
>> On Wed, Nov 11, 2020 at 2:31 AM jake...@gmail.com <jake...@gmail.com> 
>> wrote:
>>
>>> FYI, that does detect the simple case of l[0] = l, but not more 
>>> complicated circular cases like l[1] = l[1:]
>>>
>>> On Tuesday, November 10, 2020 at 2:38:26 AM UTC-5 
>>> axel.wa...@googlemail.com wrote:
>>>
>>>> If the slice is empty, it doesn't reference anything.
>>>> If it is not empty, &x[0] can be used to identify the slice 
>>>> (potentially also using len/cap, if it's interesting).
>>>>
>>>> On Tue, Nov 10, 2020 at 4:11 AM arpad ryszka <arpad....@gmail.com> 
>>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> is there a way to detect the cyclic reference in the following example 
>>>>> somehow? Either via reflection or by other means? My understanding is 
>>>>> that 
>>>>> slices cannot be compared with == (unless to nil), or used as keys in 
>>>>> maps. 
>>>>> Is there a different way?
>>>>>
>>>>> l := []interface{}{"foo"}
>>>>> l[0] = l
>>>>> fmt.Println(l)
>>>>>
>>>>> or here it is as a playground link: 
>>>>> https://play.golang.org/p/T0qZlF8m-vi
>>>>>
>>>>> Cheers,
>>>>> Arpad
>>>>>
>>>>> -- 
>>>>> 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/b2cb6b5e-febc-407f-b5b3-d9ca196ce68bn%40googlegroups.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/b2cb6b5e-febc-407f-b5b3-d9ca196ce68bn%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...@googlegroups.com.
>>>
>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/250107e9-f688-4205-ae52-728221eb2e4cn%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/250107e9-f688-4205-ae52-728221eb2e4cn%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/cc25d4f0-51fa-4851-989b-fab4527bc709n%40googlegroups.com.

Reply via email to