You need you Json type to be a concrete type, e.g. (if the underlying type
is a string)

type Json string

Then users can try to assert that what they get is of concrete type Json

Cheers,

Arnaud

On Tue, 16 Feb 2021, 08:20 Santhosh Kumar T, <santhosh.tek...@gmail.com>
wrote:

> I am not using either json.Marshaler or json.Unmarshaller
>
> my project implements mysql binlog replication protocol
>
> i have a method:   fn nextRow() []interafce{}
> which returns values in row as slice.
> the row might contain VARCHAR and JSON type columns in mysql table
> definition
> if actual json value for a row is string, then nextRow() return a slice
> containing two strings
> to distinguish i am trying to returns []interface{}{"value1",
> Json("value2")}
> but this seems does not solve the issue, since user of my library cannot
> check if it is json value or not
>
> thanks
> Santhosh
>
> On Tuesday, February 16, 2021 at 1:32:07 PM UTC+5:30
> axel.wa...@googlemail.com wrote:
>
>> An interface type-assertion asserts that the dynamic value in the
>> interface (in this case it's `string`) implements the interface you are
>> asserting (in this case `myinterface`). As `myinterface` has no methods,
>> every value implements that interface.
>>
>> In general, a type-assertion will assert things about the dynamic value
>> stored in an interface. In that code, the dynamic value is `string` *either
>> way*. In one case, you assign a `string` to `interface{}`, in the other you
>> assign a `string` to `myinterface`. But both will ultimately store a
>> `string`. That's also why your first case, using `mystring` works as
>> expected - in that case, the dynamic type is `string` in one case and
>> `mystring` in the other (note that the dynamic type is *always* a "concrete
>> type", not an interface).
>>
>> In general, ways to get around this is to either a) not use an interface,
>> or b) give that interface a method only specific types implement, or c)
>> store a `*myinterface` - it's a pointer, not an interface, thus a concrete
>> type, which can be distinguished. However, in your case, neither of these
>> strategies would likely be fruitful. The `json` package needs to know how
>> to store the values it decodes and it won't be able to, if it doesn't have
>> a concrete type or a `json.Unmarshaler`.
>>
>> So in your specific case, you might want to consider using something like
>>
>> type struct {
>>     s string
>>     n int64
>>     isString bool
>> }
>>
>> and have that implement `json.Marshaler` and `json.Unmarshaler`.
>>
>> On Tue, Feb 16, 2021 at 8:47 AM Santhosh Kumar T <santhos...@gmail.com>
>> wrote:
>>
>>> I have a function call nextRow which returns []interface{}
>>>
>>> i want to add support for json, since json value can be string, number
>>> which conflicts
>>> with native types, i used following:
>>>     type Json interface{}
>>> and returning json values as:
>>>     return Json(v)
>>> but in type checking it fails.
>>>
>>> i extract minimal code to explain my issue:
>>>    https://play.golang.org/p/AAbeOzH-SHE
>>>
>>> in the above example, it prints: v3 is myinterface
>>> but v3 is regular interface{} not of type myinterface
>>>
>>> could someone help in resolving the issue.
>>> Is this expected behavior. what can i do to workaround if so
>>>
>>> thanks
>>> Santhosh
>>>
>>> --
>>> 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/bcaa91b2-38ab-4713-93c6-34dd55792f4dn%40googlegroups.com
>>> <https://groups.google.com/d/msgid/golang-nuts/bcaa91b2-38ab-4713-93c6-34dd55792f4dn%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/41a88e9f-8301-4717-b07c-b067c687ad1cn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/41a88e9f-8301-4717-b07c-b067c687ad1cn%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/CAJ6cK1Y7-SYpJYp_Bpswz9Z1MD5pFdzvbvwRxnC14wg5boLfog%40mail.gmail.com.

Reply via email to