From 4ce5ef34dcde303de50c154c30f349ad98df54a7 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Tue, 13 Jan 2026 15:20:31 +0100 Subject: [PATCH] internal: structdiff: ignore fields with json:"-" annotation --- libs/structs/structdiff/diff.go | 4 ++++ libs/structs/structdiff/diff_test.go | 19 +++++++++++++------ libs/structs/structdiff/equal.go | 5 +++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/libs/structs/structdiff/diff.go b/libs/structs/structdiff/diff.go index 402e44dda7..886f9c1f83 100644 --- a/libs/structs/structdiff/diff.go +++ b/libs/structs/structdiff/diff.go @@ -202,6 +202,10 @@ func diffStruct(ctx *diffContext, path *structpath.PathNode, s1, s2 reflect.Valu // Resolve field name from JSON tag or fall back to Go field name fieldName := jsonTag.Name() + if fieldName == "-" { + continue + } + if fieldName == "" { fieldName = sf.Name } diff --git a/libs/structs/structdiff/diff_test.go b/libs/structs/structdiff/diff_test.go index 07c1eeb130..9e12be527e 100644 --- a/libs/structs/structdiff/diff_test.go +++ b/libs/structs/structdiff/diff_test.go @@ -10,12 +10,13 @@ import ( type B struct{ S string } type A struct { - XX int `json:"xx"` - X int `json:"x,omitempty"` - B B `json:"b,omitempty"` - P *B `json:"p,omitempty"` - M map[string]int `json:"m,omitempty"` - L []string `json:"l,omitempty"` + XX int `json:"xx"` + X int `json:"x,omitempty"` + B B `json:"b,omitempty"` + P *B `json:"p,omitempty"` + M map[string]int `json:"m,omitempty"` + L []string `json:"l,omitempty"` + Ignored string `json:"-"` } type C struct { @@ -155,6 +156,12 @@ func TestGetStructDiff(t *testing.T) { b: A{L: []string{"a", "b"}}, want: []ResolvedChange{{Field: "l", Old: []string{"a"}, New: []string{"a", "b"}}}, }, + { + name: "ignored field change", + a: A{X: 5, Ignored: "old"}, + b: A{X: 5, Ignored: "new"}, + want: nil, + }, // ForceSendFields with non-empty fields (omitempty) { diff --git a/libs/structs/structdiff/equal.go b/libs/structs/structdiff/equal.go index 6dc1c951d9..7d4ec84a65 100644 --- a/libs/structs/structdiff/equal.go +++ b/libs/structs/structdiff/equal.go @@ -110,6 +110,11 @@ func equalStruct(s1, s2 reflect.Value) bool { jsonTag := structtag.JSONTag(sf.Tag.Get("json")) + // Skip fields with json:"-" + if jsonTag.Name() == "-" { + continue + } + v1Field := s1.Field(i) v2Field := s2.Field(i)