{
  "schemaVersion": "1.0",
  "item": {
    "slug": "go",
    "name": "Go",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ivangdavila/go",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/go",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/go",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=go",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "collections.md",
      "concurrency.md",
      "errors.md",
      "interfaces.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/go"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/go",
    "agentPageUrl": "https://openagent3.xyz/skills/go/agent",
    "manifestUrl": "https://openagent3.xyz/skills/go/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/go/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Quick Reference",
        "body": "TopicFileConcurrency patternsconcurrency.mdInterface and type systeminterfaces.mdSlices, maps, stringscollections.mdError handling patternserrors.md"
      },
      {
        "title": "Goroutine Leaks",
        "body": "Goroutine blocked on channel with no sender = leak forever—always ensure channel closes or use context\nUnbuffered channel send blocks until receive—deadlock if receiver never comes\nfor range on channel loops forever until channel closed—sender must close(ch)\nContext cancellation doesn't stop goroutine automatically—must check ctx.Done() in loop\nLeaked goroutines accumulate memory and never garbage collect"
      },
      {
        "title": "Channel Traps",
        "body": "Sending to nil channel blocks forever—receiving from nil also blocks forever\nSending to closed channel panics—closing already closed channel panics\nOnly sender should close channel—receiver closing causes sender panic\nBuffered channel full = send blocks—size buffer for expected load\nselect with multiple ready cases picks randomly—not first listed"
      },
      {
        "title": "Defer Traps",
        "body": "Defer arguments evaluated immediately, not when deferred function runs—defer log(time.Now()) captures now\nDefer in loop accumulates—defers stack, run at function end not iteration end\nDefer runs even on panic—good for cleanup, but recover only in deferred function\nNamed return values modifiable in defer—defer func() { err = wrap(err) }() works\nDefer order is LIFO—last defer runs first"
      },
      {
        "title": "Interface Traps",
        "body": "Nil concrete value in interface is not nil interface—var p *MyType; var i interface{} = p; i != nil is true\nType assertion on wrong type panics—use comma-ok: v, ok := i.(Type)\nEmpty interface any accepts anything but loses type safety—avoid when possible\nInterface satisfaction is implicit—no compile error if method signature drifts\nPointer receiver doesn't satisfy interface for value type—only *T has the method"
      },
      {
        "title": "Error Handling",
        "body": "Errors are values, not exceptions—always check returned error\nerr != nil after every call—unchecked errors are silent bugs\nerrors.Is for wrapped errors—== doesn't work with fmt.Errorf(\"%w\", err)\nSentinel errors should be var ErrFoo = errors.New() not recreated\nPanic for programmer errors only—return error for runtime failures"
      },
      {
        "title": "Slice Traps",
        "body": "Slice is reference to array—modifying slice modifies original\nAppend may or may not reallocate—never assume capacity\nSlicing doesn't copy—a[1:3] shares memory with a\nNil slice and empty slice differ—var s []int vs s := []int{}\ncopy() copies min of lengths—doesn't extend destination"
      },
      {
        "title": "Map Traps",
        "body": "Reading from nil map returns zero value—writing to nil map panics\nMap iteration order is random—don't rely on order\nMaps not safe for concurrent access—use sync.Map or mutex\nTaking address of map element forbidden—&m[key] doesn't compile\nDelete from map during iteration is safe—but add may cause issues"
      },
      {
        "title": "String Traps",
        "body": "Strings are immutable byte slices—each modification creates new allocation\nrange over string iterates runes, not bytes—index jumps for multi-byte chars\nlen(s) is bytes, not characters—use utf8.RuneCountInString()\nString comparison is byte-wise—not Unicode normalized\nSubstring shares memory with original—large string keeps memory alive"
      },
      {
        "title": "Struct and Memory",
        "body": "Struct fields padded for alignment—field order affects memory size\nZero value is valid—var wg sync.WaitGroup works, no constructor needed\nCopying struct with mutex copies unlocked mutex—always pass pointer\nEmbedding is not inheritance—promoted methods can be shadowed\nExported fields start uppercase—lowercase fields invisible outside package"
      },
      {
        "title": "Build Traps",
        "body": "go build caches aggressively—use -a flag to force rebuild\nUnused imports fail compilation—use _ import for side effects only\ninit() runs before main, order by dependency—not file order\ngo:embed paths relative to source file—not working directory\nCross-compile: GOOS=linux GOARCH=amd64 go build—easy but test on target"
      }
    ],
    "body": "Quick Reference\nTopic\tFile\nConcurrency patterns\tconcurrency.md\nInterface and type system\tinterfaces.md\nSlices, maps, strings\tcollections.md\nError handling patterns\terrors.md\nGoroutine Leaks\nGoroutine blocked on channel with no sender = leak forever—always ensure channel closes or use context\nUnbuffered channel send blocks until receive—deadlock if receiver never comes\nfor range on channel loops forever until channel closed—sender must close(ch)\nContext cancellation doesn't stop goroutine automatically—must check ctx.Done() in loop\nLeaked goroutines accumulate memory and never garbage collect\nChannel Traps\nSending to nil channel blocks forever—receiving from nil also blocks forever\nSending to closed channel panics—closing already closed channel panics\nOnly sender should close channel—receiver closing causes sender panic\nBuffered channel full = send blocks—size buffer for expected load\nselect with multiple ready cases picks randomly—not first listed\nDefer Traps\nDefer arguments evaluated immediately, not when deferred function runs—defer log(time.Now()) captures now\nDefer in loop accumulates—defers stack, run at function end not iteration end\nDefer runs even on panic—good for cleanup, but recover only in deferred function\nNamed return values modifiable in defer—defer func() { err = wrap(err) }() works\nDefer order is LIFO—last defer runs first\nInterface Traps\nNil concrete value in interface is not nil interface—var p *MyType; var i interface{} = p; i != nil is true\nType assertion on wrong type panics—use comma-ok: v, ok := i.(Type)\nEmpty interface any accepts anything but loses type safety—avoid when possible\nInterface satisfaction is implicit—no compile error if method signature drifts\nPointer receiver doesn't satisfy interface for value type—only *T has the method\nError Handling\nErrors are values, not exceptions—always check returned error\nerr != nil after every call—unchecked errors are silent bugs\nerrors.Is for wrapped errors—== doesn't work with fmt.Errorf(\"%w\", err)\nSentinel errors should be var ErrFoo = errors.New() not recreated\nPanic for programmer errors only—return error for runtime failures\nSlice Traps\nSlice is reference to array—modifying slice modifies original\nAppend may or may not reallocate—never assume capacity\nSlicing doesn't copy—a[1:3] shares memory with a\nNil slice and empty slice differ—var s []int vs s := []int{}\ncopy() copies min of lengths—doesn't extend destination\nMap Traps\nReading from nil map returns zero value—writing to nil map panics\nMap iteration order is random—don't rely on order\nMaps not safe for concurrent access—use sync.Map or mutex\nTaking address of map element forbidden—&m[key] doesn't compile\nDelete from map during iteration is safe—but add may cause issues\nString Traps\nStrings are immutable byte slices—each modification creates new allocation\nrange over string iterates runes, not bytes—index jumps for multi-byte chars\nlen(s) is bytes, not characters—use utf8.RuneCountInString()\nString comparison is byte-wise—not Unicode normalized\nSubstring shares memory with original—large string keeps memory alive\nStruct and Memory\nStruct fields padded for alignment—field order affects memory size\nZero value is valid—var wg sync.WaitGroup works, no constructor needed\nCopying struct with mutex copies unlocked mutex—always pass pointer\nEmbedding is not inheritance—promoted methods can be shadowed\nExported fields start uppercase—lowercase fields invisible outside package\nBuild Traps\ngo build caches aggressively—use -a flag to force rebuild\nUnused imports fail compilation—use _ import for side effects only\ninit() runs before main, order by dependency—not file order\ngo:embed paths relative to source file—not working directory\nCross-compile: GOOS=linux GOARCH=amd64 go build—easy but test on target"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/go",
    "publisherUrl": "https://clawhub.ai/ivangdavila/go",
    "owner": "ivangdavila",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/go",
    "downloadUrl": "https://openagent3.xyz/downloads/go",
    "agentUrl": "https://openagent3.xyz/skills/go/agent",
    "manifestUrl": "https://openagent3.xyz/skills/go/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/go/agent.md"
  }
}