Hi Brian, Your code certainly identifies the different items. However, that's not a diff tool in the sense I mean. Unix diff and tools like it don't just say x[i] != y[i], they find the longest common subsequences and in essence produce a series of edit commands that would turn slice x into slice y. There are quite a few go diff tools that will do this, including my own <https://pkg.go.dev/github.com/mark-summerfield/go-diff> based on Python's difflib sequence matcher. What I want to do is find one that does this for slices of structs where only one struct field is considered for comparison purposes.
On Friday, July 14, 2023 at 10:00:34 AM UTC+1 Brian Candler wrote: > I forgot you wanted generics: > https://go.dev/play/p/PhGVjsWWTdB > > On Friday, 14 July 2023 at 09:47:21 UTC+1 Brian Candler wrote: > >> You seem to be saying "if the S field is different then I want to >> consider these two structs different, and get pointers to the two structs. >> If the S field is the same then I want to skip the pair entirely". Is that >> right? >> >> The required semantics are not entirely clear, but it sounds like a >> handful of lines of code to implement - there's no point importing and >> learning a third party library. >> >> On the assumption that all the elements to be compared are in >> corresponding positions in a and b: >> https://go.dev/play/p/Y71sLUpftzR >> >> On Friday, 14 July 2023 at 09:11:35 UTC+1 Mark wrote: >> >>> In fact the diff pkg mentioned above does work but is of no use to me >>> since for each change it gives back only the field(s) used, not the >>> original structs (or pointers to them), so I can't see any way back to the >>> original structs (or their slice indexes). >>> >>> On Friday, July 14, 2023 at 8:58:41 AM UTC+1 Mark wrote: >>> >>>> What I really want to do is to be able to diff slices of structs on the >>>> basis of one single field. >>>> For example, given: >>>> ``` >>>> type Item struct { >>>> I int >>>> S string >>>> } >>>> ``` >>>> and given `a` and `b` are both of type`[]Item`, I want to diff these >>>> slices based purely on the `S` field, ignoring the `I` field. >>>> >>>> This diff pkg <https://pkg.go.dev/github.com/r3labs/diff/v3> claims to >>>> be able to do this (something I'm testing, so I don't know either way >>>> yet), >>>> but in any case, it is incredibly slow. >>>> >>>> On Friday, July 14, 2023 at 8:31:39 AM UTC+1 Peter Galbavy wrote: >>>> >>>>> As a slight digression - I thought I was going mad, but 'slices' and >>>>> 'maps' are new :-) Only in 1.21 though... >>>>> >>>>> Well, there is a lot of boiler plate that maps.Keys() will get rid of. >>>>> >>>>> On Thursday, 13 July 2023 at 10:06:01 UTC+1 Brian Candler wrote: >>>>> >>>>>> Structs are already comparable, but all fields must be the same: >>>>>> https://go.dev/play/p/XwhSz4DEDwL >>>>>> >>>>>> I think your solution with function 'eq' is fine. You can see the >>>>>> same thing in the standard library in slices.CompactFunc and >>>>>> slices.EqualFunc >>>>>> https://pkg.go.dev/slices#CompactFunc >>>>>> https://pkg.go.dev/slices#EqualFunc >>>>>> >>>>>> For the case of "ordered" rather than "comparable", have a look at >>>>>> slices.BinarySearchFunc and related functions. >>>>>> >>>>>> On Thursday, 13 July 2023 at 09:29:38 UTC+1 Mark wrote: >>>>>> >>>>>>> I have a package which has a function `Do[T comparable](a, b []T) >>>>>>> Result`. >>>>>>> I have a struct: >>>>>>> ```go >>>>>>> type N struct { >>>>>>> x int >>>>>>> y int >>>>>>> t string >>>>>>> } >>>>>>> ``` >>>>>>> Is it possible to make `N` comparable; in particular by a field of >>>>>>> my choice, e.g., `t`? >>>>>>> >>>>>>> Or will I have to make, say, `DoFunc(a, b []N, eq func(i, j N) bool) >>>>>>> Result` with, say, >>>>>>> `func eq(i, j N) { return i.t == j.t }`? >>>>>>> >>>>>> -- 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/51736175-1ecf-406b-acd4-29414f593d13n%40googlegroups.com.