Install
openclaw skills install goWrite reliable Go code avoiding goroutine leaks, interface traps, and common concurrency bugs.
openclaw skills install go| Topic | File |
|---|---|
| Concurrency patterns | concurrency.md |
| Interface and type system | interfaces.md |
| Slices, maps, strings | collections.md |
| Error handling patterns | errors.md |
for range on channel loops forever until channel closed—sender must close(ch)ctx.Done() in loopselect with multiple ready cases picks randomly—not first listeddefer log(time.Now()) captures nowdefer func() { err = wrap(err) }() worksvar p *MyType; var i interface{} = p; i != nil is truev, ok := i.(Type)any accepts anything but loses type safety—avoid when possible*T has the methoderr != nil after every call—unchecked errors are silent bugserrors.Is for wrapped errors—== doesn't work with fmt.Errorf("%w", err)var ErrFoo = errors.New() not recreateda[1:3] shares memory with avar s []int vs s := []int{}copy() copies min of lengths—doesn't extend destinationsync.Map or mutex&m[key] doesn't compilerange over string iterates runes, not bytes—index jumps for multi-byte charslen(s) is bytes, not characters—use utf8.RuneCountInString()var wg sync.WaitGroup works, no constructor neededgo build caches aggressively—use -a flag to force rebuild_ import for side effects onlyinit() runs before main, order by dependency—not file ordergo:embed paths relative to source file—not working directoryGOOS=linux GOARCH=amd64 go build—easy but test on target