{"id":"7fe6925f-3ee6-4a11-8c6a-358c5915db50","shortId":"zX4hnn","kind":"skill","title":"golang-samber-ro","tagline":"Reactive streams and event-driven programming in Golang using samber/ro — ReactiveX implementation with 150+ type-safe operators, cold/hot observables, 5 subject types (Publish, Behavior, Replay, Async, Unicast), declarative pipelines via Pipe, 40+ plugins (HTTP, cron, fsnotify, ","description":"**Persona:** You are a Go engineer who reaches for reactive streams when data flows asynchronously or infinitely. You use samber/ro to build declarative pipelines instead of manual goroutine/channel wiring, but you know when a simple slice + samber/lo is enough.\n\n**Thinking mode:** Use `ultrathink` when designing advanced reactive pipelines or choosing between cold/hot observables, subjects, and combining operators. Wrong architecture leads to resource leaks or missed events.\n\n# samber/ro — Reactive Streams for Go\n\nGo implementation of [ReactiveX](https://reactivex.io/). Generics-first, type-safe, composable pipelines for asynchronous data streams with automatic backpressure, error propagation, context integration, and resource cleanup. 150+ operators, 5 subject types, 40+ plugins.\n\n**Official Resources:**\n\n- [github.com/samber/ro](https://github.com/samber/ro)\n- [ro.samber.dev](https://ro.samber.dev)\n- [pkg.go.dev/github.com/samber/ro](https://pkg.go.dev/github.com/samber/ro)\n\nThis skill is not exhaustive. Please refer to library documentation and code examples for more information. Context7 can help as a discoverability platform.\n\n## Why samber/ro (Streams vs Slices)\n\nGo channels + goroutines become unwieldy for complex async pipelines: manual channel closures, verbose goroutine lifecycle, error propagation across nested selects, and no composable operators. `samber/ro` solves this with declarative, chainable stream operators.\n\n**When to use which tool:**\n\n| Scenario | Tool | Why |\n| --- | --- | --- |\n| Transform a slice (map, filter, reduce) | `samber/lo` | Finite, synchronous, eager — no stream overhead needed |\n| Simple goroutine fan-out with error handling | `errgroup` | Standard lib, lightweight, sufficient for bounded concurrency |\n| Infinite event stream (WebSocket, tickers, file watcher) | `samber/ro` | Declarative pipeline with backpressure, retry, timeout, combine |\n| Real-time data enrichment from multiple async sources | `samber/ro` | CombineLatest/Zip compose dependent streams without manual select |\n| Pub/sub with multiple consumers sharing one source | `samber/ro` | Hot observables (Share/Subjects) handle multicast natively |\n\n**Key differences: lo vs ro**\n\n| Aspect | `samber/lo` | `samber/ro` |\n| --- | --- | --- |\n| Data | Finite slices | Infinite streams |\n| Execution | Synchronous, blocking | Asynchronous, non-blocking |\n| Evaluation | Eager (allocates intermediate slices) | Lazy (processes items as they arrive) |\n| Timing | Immediate | Time-aware (delay, throttle, interval, timeout) |\n| Error model | Return `(T, error)` per call | Error channel propagates through pipeline |\n| Use case | Collection transforms | Event-driven, real-time, async pipelines |\n\n## Installation\n\n```bash\ngo get github.com/samber/ro\n```\n\n## Core Concepts\n\nFour building blocks:\n\n1. **Observable** — a data source that emits values over time. Cold by default: each subscriber triggers independent execution from scratch\n2. **Observer** — a consumer with three callbacks: `onNext(T)`, `onError(error)`, `onComplete()`\n3. **Operator** — a function that transforms an observable into another observable, chained via `Pipe`\n4. **Subscription** — the connection between observable and observer. Call `.Wait()` to block or `.Unsubscribe()` to cancel\n\n```go\nobservable := ro.Pipe2(\n    ro.RangeWithInterval(0, 5, 1*time.Second),\n    ro.Filter(func(x int) bool { return x%2 == 0 }),\n    ro.Map(func(x int) string { return fmt.Sprintf(\"even-%d\", x) }),\n)\n\nobservable.Subscribe(ro.NewObserver(\n    func(s string) { fmt.Println(s) },      // onNext\n    func(err error) { log.Println(err) },    // onError\n    func() { fmt.Println(\"Done!\") },         // onComplete\n))\n// Output: \"even-0\", \"even-2\", \"even-4\", \"Done!\"\n\n// Or collect synchronously:\nvalues, err := ro.Collect(observable)\n```\n\n## Cold vs Hot Observables\n\n**Cold** (default): each `.Subscribe()` starts a new independent execution. Safe and predictable — use by default.\n\n**Hot**: multiple subscribers share a single execution. Use when the source is expensive (WebSocket, DB poll) or subscribers must see the same events.\n\n| Convert with | Behavior |\n| --- | --- |\n| `Share()` | Cold → hot with reference counting. Last unsubscribe tears down |\n| `ShareReplay(n)` | Same as Share + buffers last N values for late subscribers |\n| `Connectable()` | Cold → hot, but waits for explicit `.Connect()` call |\n| Subjects | Natively hot — call `.Send()`, `.Error()`, `.Complete()` directly |\n\n| Subject | Constructor | Replay behavior |\n| --- | --- | --- |\n| `PublishSubject` | `NewPublishSubject[T]()` | None — late subscribers miss past events |\n| `BehaviorSubject` | `NewBehaviorSubject[T](initial)` | Replays last value to new subscribers |\n| `ReplaySubject` | `NewReplaySubject[T](bufferSize)` | Replays last N values |\n| `AsyncSubject` | `NewAsyncSubject[T]()` | Emits only last value, only on complete |\n| `UnicastSubject` | `NewUnicastSubject[T](bufferSize)` | Single subscriber only |\n\nFor subject details and hot observable patterns, see [Subjects Guide](./references/subjects-guide.md).\n\n## Operator Quick Reference\n\n| Category | Key operators | Purpose |\n| --- | --- | --- |\n| Creation | `Just`, `FromSlice`, `FromChannel`, `Range`, `Interval`, `Defer`, `Future` | Create observables from various sources |\n| Transform | `Map`, `MapErr`, `FlatMap`, `Scan`, `Reduce`, `GroupBy` | Transform or accumulate stream values |\n| Filter | `Filter`, `Take`, `TakeLast`, `Skip`, `Distinct`, `Find`, `First`, `Last` | Selectively emit values |\n| Combine | `Merge`, `Concat`, `Zip2`–`Zip6`, `CombineLatest2`–`CombineLatest5`, `Race` | Merge multiple observables |\n| Error | `Catch`, `OnErrorReturn`, `OnErrorResumeNextWith`, `Retry`, `RetryWithConfig` | Recover from errors |\n| Timing | `Delay`, `DelayEach`, `Timeout`, `ThrottleTime`, `SampleTime`, `BufferWithTime` | Control emission timing |\n| Side effect | `Tap`/`Do`, `TapOnNext`, `TapOnError`, `TapOnComplete` | Observe without altering stream |\n| Terminal | `Collect`, `ToSlice`, `ToChannel`, `ToMap` | Consume stream into Go types |\n\nUse typed `Pipe2`, `Pipe3` ... `Pipe25` for compile-time type safety across operator chains. The untyped `Pipe` uses `any` and loses type checking.\n\nFor the complete operator catalog (150+ operators with signatures), see [Operators Guide](./references/operators-guide.md).\n\n## Common Mistakes\n\n| Mistake | Why it fails | Fix |\n| --- | --- | --- |\n| Using `ro.OnNext()` without error handler | Errors are silently dropped — bugs hide in production | Use `ro.NewObserver(onNext, onError, onComplete)` with all 3 callbacks |\n| Using untyped `Pipe()` instead of `Pipe2`/`Pipe3` | Loses compile-time type safety, errors surface at runtime | Use `Pipe2`, `Pipe3`...`Pipe25` for typed operator chains |\n| Forgetting `.Unsubscribe()` on infinite streams | Goroutine leak — the observable runs forever | Use `TakeUntil(signal)`, context cancellation, or explicit `Unsubscribe()` |\n| Using `Share()` when cold is sufficient | Unnecessary complexity, harder to reason about lifecycle | Use hot observables only when multiple consumers need the same stream |\n| Using `samber/ro` for finite slice transforms | Stream overhead (goroutines, subscriptions) for a synchronous operation | Use `samber/lo` — it's simpler, faster, and purpose-built for slices |\n| Not propagating context for cancellation | Streams ignore shutdown signals, causing resource leaks on termination | Chain `ContextWithTimeout` or `ThrowOnContextCancel` in the pipeline |\n\n## Best Practices\n\n1. **Always handle all three events** — use `NewObserver(onNext, onError, onComplete)`, not just `OnNext`. Unhandled errors cause silent data loss\n2. **Use `Collect()` for synchronous consumption** — when the stream is finite and you need `[]T`, `Collect` blocks until complete and returns the slice + error\n3. **Prefer typed Pipe functions** — `Pipe2`, `Pipe3`...`Pipe25` catch type mismatches at compile time. Reserve untyped `Pipe` for dynamic operator chains\n4. **Bound infinite streams** — use `Take(n)`, `TakeUntil(signal)`, `Timeout(d)`, or context cancellation. Unbounded streams leak goroutines\n5. **Use `Tap`/`Do` for observability** — log, trace, or meter emissions without altering the stream. Chain `TapOnError` for error monitoring\n6. **Prefer `samber/lo` for simple transforms** — if the data is a finite slice and you need Map/Filter/Reduce, use `lo`. Reach for `ro` when data arrives over time, from multiple sources, or needs retry/timeout/backpressure\n\n## Plugin Ecosystem\n\n40+ plugins extend ro with domain-specific operators:\n\n| Category | Plugins | Import path prefix |\n| --- | --- | --- |\n| Encoding | JSON, CSV, Base64, Gob | `plugins/encoding/...` |\n| Network | HTTP, I/O, FSNotify | `plugins/http`, `plugins/io`, `plugins/fsnotify` |\n| Scheduling | Cron, ICS | `plugins/cron`, `plugins/ics` |\n| Observability | Zap, Slog, Zerolog, Logrus, Sentry, Oops | `plugins/observability/...`, `plugins/samber/oops` |\n| Rate limiting | Native, Ulule | `plugins/ratelimit/...` |\n| Data | Bytes, Strings, Sort, Strconv, Regexp, Template | `plugins/bytes`, `plugins/strings`, etc. |\n| System | Process, Signal | `plugins/proc`, `plugins/signal` |\n\nFor the full plugin catalog with import paths and usage examples, see [Plugin Ecosystem](./references/plugin-ecosystem.md).\n\nFor real-world reactive patterns (retry+timeout, WebSocket fan-out, graceful shutdown, stream combination), see [Patterns](./references/patterns.md).\n\nIf you encounter a bug or unexpected behavior in samber/ro, open an issue at [github.com/samber/ro/issues](https://github.com/samber/ro/issues).\n\n## Cross-References\n\n- → See `samber/cc-skills-golang@golang-samber-lo` skill for finite slice transforms (Map, Filter, Reduce, GroupBy) — use lo when data is already in a slice\n- → See `samber/cc-skills-golang@golang-samber-mo` skill for monadic types (Option, Result, Either) that compose with ro pipelines\n- → See `samber/cc-skills-golang@golang-samber-hot` skill for in-memory caching (also available as an ro plugin)\n- → See `samber/cc-skills-golang@golang-concurrency` skill for goroutine/channel patterns when reactive streams are overkill\n- → See `samber/cc-skills-golang@golang-observability` skill for monitoring reactive pipelines in production","tags":["golang","samber","skills","agent","agent-skills","antigravity","claude","claude-code","code","codex","coding","copilot"],"capabilities":["skill","source-samber","skill-golang-samber-ro","topic-agent","topic-agent-skills","topic-antigravity","topic-claude","topic-claude-code","topic-code","topic-codex","topic-coding","topic-copilot","topic-cursor","topic-gemini","topic-gemini-cli-extension"],"categories":["cc-skills-golang"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-ro","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add samber/cc-skills-golang","source_repo":"https://github.com/samber/cc-skills-golang","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1725 github stars · SKILL.md body (10,263 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:02.559Z","embedding":null,"createdAt":"2026-04-18T20:32:57.808Z","updatedAt":"2026-05-18T18:53:02.559Z","lastSeenAt":"2026-05-18T18:53:02.559Z","tsv":"'-0':489 '-2':491 '-4':493 '/).':120 '/github.com/samber/ro](https://pkg.go.dev/github.com/samber/ro)':159 '/references/operators-guide.md':775 '/references/patterns.md':1154 '/references/plugin-ecosystem.md':1135 '/references/subjects-guide.md':644 '/samber/ro':374 '/samber/ro/issues](https://github.com/samber/ro/issues).':1171 '/samber/ro](https://github.com/samber/ro)':154 '0':446,458 '1':380,448,922 '150':19,143,768 '2':400,457,942 '3':412,803,966 '4':426,987 '40':38,148,1060 '5':26,145,447,1005 '6':1025 'accumul':674 'across':205,751 'advanc':88 'alloc':326 'alreadi':1195 'also':1229 'alter':728,1017 'alway':923 'anoth':421 'architectur':101 'arriv':334,1049 'aspect':309 'async':32,195,280,366 'asynchron':57,130,320 'asyncsubject':617 'automat':134 'avail':1230 'awar':339 'backpressur':135,269 'base64':1077 'bash':369 'becom':191 'behavior':30,546,589,1162 'behaviorsubject':599 'best':920 'block':319,323,379,437,958 'bool':454 'bound':256,988 'buffer':562 'buffers':612,630 'bufferwithtim':715 'bug':792,1159 'build':64,378 'built':896 'byte':1107 'cach':1228 'call':350,434,577,581 'callback':406,804 'cancel':441,845,903,1000 'case':357 'catalog':767,1125 'catch':701,974 'categori':648,1069 'caus':908,938 'chain':423,753,829,913,986,1020 'chainabl':217 'channel':189,198,352 'check':762 'choos':92 'cleanup':142 'closur':199 'code':171 'cold':390,502,506,548,570,852 'cold/hot':24,94 'collect':358,496,731,944,957 'combin':98,272,689,1151 'combinelatest/zip':283 'combinelatest2':694 'combinelatest5':695 'common':776 'compil':747,814,978 'compile-tim':746,813 'complet':584,626,765,960 'complex':194,856 'compos':127,210,284,1213 'concat':691 'concept':376 'concurr':257,1239 'connect':429,569,576 'constructor':587 'consum':293,403,735,868 'consumpt':947 'context':138,844,901,999 'context7':176 'contextwithtimeout':914 'control':716 'convert':544 'core':375 'count':552 'creat':660 'creation':652 'cron':41,1088 'cross':1173 'cross-refer':1172 'csv':1076 'd':467,997 'data':55,131,276,312,383,940,1033,1048,1106,1193 'db':535 'declar':34,65,216,266 'default':392,507,520 'defer':658 'delay':340,710 'delayeach':711 'depend':285 'design':87 'detail':636 'differ':305 'direct':585 'discover':181 'distinct':682 'document':169 'domain':1066 'domain-specif':1065 'done':485,494 'driven':10,362 'drop':791 'dynam':984 'eager':237,325 'ecosystem':1059,1134 'effect':720 'either':1211 'emiss':717,1015 'emit':386,620,687 'encod':1074 'encount':1157 'engin':48 'enough':81 'enrich':277 'err':478,481,499 'errgroup':250 'error':136,203,248,344,348,351,410,479,583,700,708,786,788,818,937,965,1023 'etc':1115 'evalu':324 'even':466,488,490,492 'event':9,108,259,361,543,598,927 'event-driven':8,360 'exampl':172,1131 'execut':317,397,514,527 'exhaust':164 'expens':533 'explicit':575,847 'extend':1062 'fail':781 'fan':245,1146 'fan-out':244,1145 'faster':892 'file':263 'filter':232,677,678,1187 'find':683 'finit':235,313,876,952,1036,1183 'first':123,684 'fix':782 'flatmap':668 'flow':56 'fmt.println':474,484 'fmt.sprintf':465 'forev':840 'forget':830 'four':377 'fromchannel':655 'fromslic':654 'fsnotifi':42,1083 'full':1123 'func':451,460,471,477,483 'function':415,970 'futur':659 'generic':122 'generics-first':121 'get':371 'github.com':153,373,1170 'github.com/samber/ro':372 'github.com/samber/ro/issues](https://github.com/samber/ro/issues).':1169 'github.com/samber/ro](https://github.com/samber/ro)':152 'go':47,113,114,188,370,442,738 'gob':1078 'golang':2,13,1178,1202,1220,1238,1252 'golang-concurr':1237 'golang-observ':1251 'golang-samber-hot':1219 'golang-samber-lo':1177 'golang-samber-mo':1201 'golang-samber-ro':1 'goroutin':190,201,243,835,881,1004 'goroutine/channel':70,1242 'grace':1148 'groupbi':671,1189 'guid':643,774 'handl':249,301,924 'handler':787 'harder':857 'help':178 'hide':793 'hot':298,504,521,549,571,580,638,863,1222 'http':40,1081 'i/o':1082 'ic':1089 'ignor':905 'immedi':336 'implement':17,115 'import':1071,1127 'in-memori':1225 'independ':396,513 'infinit':59,258,315,833,989 'inform':175 'initi':602 'instal':368 'instead':67,808 'int':453,462 'integr':139 'intermedi':327 'interv':342,657 'issu':1167 'item':331 'json':1075 'key':304,649 'know':74 'last':553,563,604,614,622,685 'late':567,594 'lazi':329 'lead':102 'leak':105,836,910,1003 'lib':252 'librari':168 'lifecycl':202,861 'lightweight':253 'limit':1102 'lo':306,1043,1180,1191 'log':1011 'log.println':480 'logrus':1096 'lose':760,812 'loss':941 'manual':69,197,288 'map':231,666,1186 'map/filter/reduce':1041 'maperr':667 'memori':1227 'merg':690,697 'meter':1014 'mismatch':976 'miss':107,596 'mistak':777,778 'mo':1204 'mode':83 'model':345 'monad':1207 'monitor':1024,1256 'multicast':302 'multipl':279,292,522,698,867,1053 'must':539 'n':558,564,615,993 'nativ':303,579,1103 'need':241,869,955,1040,1056 'nest':206 'network':1080 'new':512,607 'newasyncsubject':618 'newbehaviorsubject':600 'newobserv':929 'newpublishsubject':591 'newreplaysubject':610 'newunicastsubject':628 'non':322 'non-block':321 'none':593 'observ':25,95,299,381,401,419,422,431,433,443,501,505,639,661,699,726,838,864,1010,1092,1253 'observable.subscribe':469 'offici':150 'oncomplet':411,486,800,932 'one':295 'onerror':409,482,799,931 'onerrorresumenextwith':703 'onerrorreturn':702 'onnext':407,476,798,930,935 'oop':1098 'open':1165 'oper':23,99,144,211,219,413,645,650,752,766,769,773,828,886,985,1068 'option':1209 'output':487 'overhead':240,880 'overkil':1248 'past':597 'path':1072,1128 'pattern':640,1141,1153,1243 'per':349 'persona':43 'pipe':37,425,756,807,969,982 'pipe2':742,810,823,971 'pipe25':744,825,973 'pipe3':743,811,824,972 'pipelin':35,66,90,128,196,267,355,367,919,1216,1258 'pkg.go.dev':158 'pkg.go.dev/github.com/samber/ro](https://pkg.go.dev/github.com/samber/ro)':157 'platform':182 'pleas':165 'plugin':39,149,1058,1061,1070,1124,1133,1234 'plugins/bytes':1113 'plugins/cron':1090 'plugins/encoding':1079 'plugins/fsnotify':1086 'plugins/http':1084 'plugins/ics':1091 'plugins/io':1085 'plugins/observability':1099 'plugins/proc':1119 'plugins/ratelimit':1105 'plugins/samber/oops':1100 'plugins/signal':1120 'plugins/strings':1114 'poll':536 'practic':921 'predict':517 'prefer':967,1026 'prefix':1073 'process':330,1117 'product':795,1260 'program':11 'propag':137,204,353,900 'pub/sub':290 'publish':29 'publishsubject':590 'purpos':651,895 'purpose-built':894 'quick':646 'race':696 'rang':656 'rate':1101 'reach':50,1044 'reactiv':5,52,89,110,1140,1245,1257 'reactivex':16,117 'reactivex.io':119 'reactivex.io/).':118 'real':274,364,1138 'real-tim':273,363 'real-world':1137 'reason':859 'recov':706 'reduc':233,670,1188 'refer':166,551,647,1174 'regexp':1111 'replay':31,588,603,613 'replaysubject':609 'reserv':980 'resourc':104,141,151,909 'result':1210 'retri':270,704,1142 'retry/timeout/backpressure':1057 'retrywithconfig':705 'return':346,455,464,962 'ro':4,308,1046,1063,1215,1233 'ro.collect':500 'ro.filter':450 'ro.map':459 'ro.newobserver':470,797 'ro.onnext':784 'ro.pipe2':444 'ro.rangewithinterval':445 'ro.samber.dev':155,156 'run':839 'runtim':821 'safe':22,126,515 'safeti':750,817 'samber':3,1179,1203,1221 'samber/cc-skills-golang':1176,1200,1218,1236,1250 'samber/lo':79,234,310,888,1027 'samber/ro':15,62,109,184,212,265,282,297,311,874,1164 'sampletim':714 'scan':669 'scenario':225 'schedul':1087 'scratch':399 'see':540,641,772,1132,1152,1175,1199,1217,1235,1249 'select':207,289,686 'send':582 'sentri':1097 'share':294,524,547,561,850 'share/subjects':300 'sharereplay':557 'shutdown':906,1149 'side':719 'signal':843,907,995,1118 'signatur':771 'silent':790,939 'simpl':77,242,1029 'simpler':891 'singl':526,631 'skill':161,1181,1205,1223,1240,1254 'skill-golang-samber-ro' 'skip':681 'slice':78,187,230,314,328,877,898,964,1037,1184,1198 'slog':1094 'solv':213 'sort':1109 'sourc':281,296,384,531,664,1054 'source-samber' 'specif':1067 'standard':251 'start':510 'strconv':1110 'stream':6,53,111,132,185,218,239,260,286,316,675,729,736,834,872,879,904,950,990,1002,1019,1150,1246 'string':463,473,1108 'subject':27,96,146,578,586,635,642 'subscrib':394,509,523,538,568,595,608,632 'subscript':427,882 'suffici':254,854 'surfac':819 'synchron':236,318,497,885,946 'system':1116 'take':679,992 'takelast':680 'takeuntil':842,994 'tap':721,1007 'taponcomplet':725 'taponerror':724,1021 'taponnext':723 'tear':555 'templat':1112 'termin':730,912 'think':82 'three':405,926 'throttl':341 'throttletim':713 'throwoncontextcancel':916 'ticker':262 'time':275,335,338,365,389,709,718,748,815,979,1051 'time-awar':337 'time.second':449 'timeout':271,343,712,996,1143 'tochannel':733 'tomap':734 'tool':224,226 'topic-agent' 'topic-agent-skills' 'topic-antigravity' 'topic-claude' 'topic-claude-code' 'topic-code' 'topic-codex' 'topic-coding' 'topic-copilot' 'topic-cursor' 'topic-gemini' 'topic-gemini-cli-extension' 'toslic':732 'trace':1012 'transform':228,359,417,665,672,878,1030,1185 'trigger':395 'type':21,28,125,147,739,741,749,761,816,827,968,975,1208 'type-saf':20,124 'ultrathink':85 'ulul':1104 'unbound':1001 'unexpect':1161 'unhandl':936 'unicast':33 'unicastsubject':627 'unnecessari':855 'unsubscrib':439,554,831,848 'untyp':755,806,981 'unwieldi':192 'usag':1130 'use':14,61,84,222,356,518,528,740,757,783,796,805,822,841,849,862,873,887,928,943,991,1006,1042,1190 'valu':387,498,565,605,616,623,676,688 'various':663 'verbos':200 'via':36,424 'vs':186,307,503 'wait':435,573 'watcher':264 'websocket':261,534,1144 'wire':71 'without':287,727,785,1016 'world':1139 'wrong':100 'x':452,456,461,468 'zap':1093 'zerolog':1095 'zip2':692 'zip6':693","prices":[{"id":"a9fe186c-7e2e-465b-873c-46d50ed5fb72","listingId":"7fe6925f-3ee6-4a11-8c6a-358c5915db50","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"samber","category":"cc-skills-golang","install_from":"skills.sh"},"createdAt":"2026-04-18T20:32:57.808Z"}],"sources":[{"listingId":"7fe6925f-3ee6-4a11-8c6a-358c5915db50","source":"github","sourceId":"samber/cc-skills-golang/golang-samber-ro","sourceUrl":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-ro","isPrimary":false,"firstSeenAt":"2026-04-18T21:55:21.399Z","lastSeenAt":"2026-05-18T18:53:02.559Z"},{"listingId":"7fe6925f-3ee6-4a11-8c6a-358c5915db50","source":"skills_sh","sourceId":"samber/cc-skills-golang/golang-samber-ro","sourceUrl":"https://skills.sh/samber/cc-skills-golang/golang-samber-ro","isPrimary":true,"firstSeenAt":"2026-04-18T20:32:57.808Z","lastSeenAt":"2026-05-07T22:40:28.548Z"}],"details":{"listingId":"7fe6925f-3ee6-4a11-8c6a-358c5915db50","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"samber","slug":"golang-samber-ro","github":{"repo":"samber/cc-skills-golang","stars":1725,"topics":["agent","agent-skills","ai","antigravity","claude","claude-code","code","codex","coding","copilot","cursor","gemini","gemini-cli-extension","openclaw","opencode","plugin","skills","skillsmp","vibe-coding"],"license":"mit","html_url":"https://github.com/samber/cc-skills-golang","pushed_at":"2026-05-18T17:36:00Z","description":"🧑‍🎨 A collection of Golang agentic skills that works","skill_md_sha":"55570e003156eae22274d667379b962874f10f91","skill_md_path":"skills/golang-samber-ro/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/samber/cc-skills-golang/tree/main/skills/golang-samber-ro"},"layout":"multi","source":"github","category":"cc-skills-golang","frontmatter":{"name":"golang-samber-ro","license":"MIT","description":"Reactive streams and event-driven programming in Golang using samber/ro — ReactiveX implementation with 150+ type-safe operators, cold/hot observables, 5 subject types (Publish, Behavior, Replay, Async, Unicast), declarative pipelines via Pipe, 40+ plugins (HTTP, cron, fsnotify, JSON, logging), automatic backpressure, error propagation, and Go context integration. Apply when using or adopting samber/ro, when the codebase imports github.com/samber/ro, or when building asynchronous event-driven pipelines, real-time data processing, streams, or reactive architectures in Go. Not for finite slice transforms (-> See golang-samber-lo skill).","compatibility":"Designed for Claude Code or similar AI coding agents, and for projects using Golang."},"skills_sh_url":"https://skills.sh/samber/cc-skills-golang/golang-samber-ro"},"updatedAt":"2026-05-18T18:53:02.559Z"}}