Hi,

in some sense, every change to an exported symbol is a breaking change
<https://blog.merovius.de/2015/07/29/backwards-compatibility-in-go.html>.
So a straight-forward "does this change have the potential to break a
reverse dependency" is simply not the best way to look at compatibility. We
need more nuance.

In general, I believe it would be fair to tell the consumer of a struct
that if they want to be guarded against this kind of breakage, they can't
use the conversion-ignoring-struct-tags utility, but have to copy the
fields one by one. That is similar to how we already tell the consumers of
a struct that they need to use struct-literals with field-names.

To the producer I would say that they should consider how a struct is used,
to decide if something is a breaking change or not. For example, I believe
it would be fair to assume that an http.Server is not something that would
be serialized so there would likely be little need to consider adding a
struct field a breaking change. But something like a jwt token, or other
plain-old-data struct types should probably be aware of this and might have
to consider adding a field a breaking change.

In either case, I think you bring up an interesting case that I haven't
thought about, before. Personally, I feel that at its core, the approach of
controlling encoding behavior via struct tags just isn't friendly towards
other packages re-using the same type, but changing encoding aspects.
Allowing conversions to ignore struct tags was a way to remedy that, but as
you demonstrate, that's still far from ideal.

So perhaps what we should do is discourage new encoding packages from
coupling options to the type itself and instead encourage pass them to the
encoder directly - or at least providing the option to do so. At the end of
the day, Go gives authority over a type to the package defining it, both in
terms of what the language allows and in terms of domains of breaking
changes. So if we want to enable people to re-use a type with different
encodings, we should have a way to customize the encoding behavior of types
without having to touch them directly.

On Thu, Mar 11, 2021 at 6:15 PM 'Colin Arnott' via golang-nuts <
golang-nuts@googlegroups.com> wrote:

> When working with wire formats, serialisation, and external types, it is
> useful to change the struct tags: https://play.golang.org/p/h6b6FmeDuaR.
> But when the original struct has a field added, this breaks:
> https://play.golang.org/p/VHmV9r2MxNt. It seems like a foregone
> conclusion that we suggest against adding a struct field because it is a
> breaking change. That said, we probably do not want to restrict the ability
> to convert structs as it is really helpful. Is this a known issue or
> previously discussed topic? If not what if anything should be done to
> clarify best practices?
>
> --
> 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/dcdcbd6a-838e-47c1-8b3d-935d485d96b5n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/dcdcbd6a-838e-47c1-8b3d-935d485d96b5n%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/CAEkBMfGp%2B%2B90tK1A-Sti1wjap%3DXxBU-QfrE1ReUSCYDt75tmHQ%40mail.gmail.com.

Reply via email to