Goè¨èªã§sliceã®éè¤æé¤ã«ã¤ãã¦æ¸ãã¾ããGo 1.21åæã§ãã
slices ããã±ã¼ã¸ã使ã£ã¦ã®éè¤æé¤
Go 1.21ãã slices ããã±ã¼ã¸ãå¢ãã¾ãããããã«çãã¦ãã颿°ãå©ç¨ãã¦éè¤åé¤ã®ã³ã¼ããæ¸ãã¾ãã
pkg.go.dev
ä¾ãã° int ã® slice ã®éè¤æé¤ã¯ä»¥ä¸ã®ããã«æ¸ãã¾ãã
integers := []int{1, 2, 2, 1} slices.Sort(integers) // [1 1 2 2] uniqValues := slices.Compact(integers) // [1 2]
slices.Compact
ã¯é£ç¶ããå¤ã1ã¤ã«ã¾ã¨ãã颿°ãªã®ã§ãéè¤æé¤ãããå ´å㯠slices.Sort
ã§å
ã«ã½ã¼ãããå¿
è¦ãããã¾ãã
User ã¨ãã struct ã® slice ã id ã§éè¤æé¤ãããå ´åã¯ã©ãããã°ãããã¨ããã¨ãæ¯è¼é¢æ°ãèªåã§æ¸¡ãã slices.SortFunc
㨠slices.CompactFunc
ãç¨æããã¦ããã®ã§ã以ä¸ã®ããã«æ¸ãã¾ãã
slices.SortFunc(users, func(a, b User) int { return cmp.Compare(a.id, b.id) }) uniqUsers := slices.CompactFunc(users, func(a, b User) bool { return a.id == b.id })
samber/lo ããã±ã¼ã¸ã使ã£ã¦ã®éè¤æé¤
samber/lo ã¨ããLodash風ã®ãµã¼ããã¼ãã£ãªã©ã¤ãã©ãªããããããã使ãã¨ããçãè¨è¿°ã§åããã¨ãå®ç¾ã§ãã¾ãã
github.com
int ã® slice ã®éè¤æé¤ã¯1è¡ã§å®ç¾ã§ãã¾ãã
uniqValues := lo.Uniq([]int{1, 2, 2, 1}) // [1 2]
User ã® slice ã®éè¤æé¤ã¯ UniqBy ã¨ãã便å©ãªé¢æ°ãç¨æããã¦ããã®ã§ä»¥ä¸ã®3è¡ã§ã·ã³ãã«ã«æ¸ãã¾ãã
uniqUsers := lo.UniqBy(users, func(u User) int { return u.id })
è¨è¿°éã®å°ãªãã§ã¯ samber/lo ã®ã»ããåªãã¦ãã¾ããããµã¼ããã¼ãã£ããã±ã¼ã¸ãä¾åã«å ¥ããå¿ è¦ãããã®ã§ãããã©ããããã¯å人ã®å¤æã«ãªãã¾ãã
Goã®æ¨æºããã±ã¼ã¸ã«UniqãUniqFuncãå¢ãããã¨ã¯ãªãã®ã
æ¨æºããã±ã¼ã¸ã« lo.Uniq
ã lo.UniqBy
ã«å¯¾å¿ãã颿°ãå¢ããã便å©ããã«æãã¾ãããå
¥ãä½å°ã¯ããã®ã§ããããã
Goã®ãªãã¸ããªã®issueãè¦ã¦ããã以ä¸ã®ãããªã³ã¡ã³ããããã¾ããã
- https://github.com/golang/go/issues/41517#issuecomment-697803340
- https://github.com/golang/go/issues/41517#issuecomment-1607608922
ç¹ã« Russ Cox ã«ãããéè¤æé¤ã¨ã½ã¼ãã¯ãããã»ããããã¨èãã¦ãããã¨ããæè¦ã大ããã®ããªã¨æã£ã¦ãã¦ã確ãã«Unixã§ sort
ãã¦ãã uniq
ããã¨ããæ¸ãæ¹ã¨æãã
ã¡ãªã¿ã«ããããªãã§ Compact
ã£ã¦ååã«ãªã£ãã®ãã¨ããã¨è²ã
è°è«ããã£ãä¸ãéè¤æé¤ãã¦ããã颿°ãªã®ã ã¨ã¦ã¼ã¶ãåéããããã¨ãããã¨ã§æçµçã« Russ Cox ã®æè¦ãéã£ãããã§ãã https://github.com/golang/go/issues/45955#issuecomment-880076961
ã¾ããRob Pike ãããã³ã¢ã©ã¤ãã©ãªã« Uniq
ã UniqFunc
ãããªãã®ã§ã¯ã¨ã³ã¡ã³ããã¦ãããï¼éè¤æé¤ã«ã¤ãã¦è¨ã£ã¦ãã®ãã Compact
ãè¦ããªãã¨è¨ã£ã¦ãã®ãã¯èªã¿åããªãã£ãã§ããï¼ https://github.com/golang/go/issues/45955#issuecomment-861173504
ããããæããªã®ã§ãproposalãåºããããã£ã³ã¹ã¯ã¼ãã§ã¯ãªããããããªãã§ããããSortãã¦ããCompactã§ããã®ã§ã¯ï¼ãã¨è¨ãããå¯è½æ§ã大ããããªå°è±¡ãåãã¾ããã