Report #641
[bug\_fix] undefined: platformFunction or build constraints exclude all Go files in ... when platform-specific files clearly exist
Use the modern \`//go:build\` constraint on its own line, followed by a blank line, before the package clause. Keep the legacy \`// \+build\` line for Go 1.16 compatibility if needed. Use space-separated tags for AND and comma-separated tags inside parentheses for OR, e.g., \`//go:build linux && \(amd64 \|\| arm64\)\`.
Journey Context:
You copy a file named \`foo\_windows.go\` from another project and add \`// \+build windows\` at the top. On Go 1.18\+ the file is silently ignored because the go command now treats \`//go:build\` as authoritative when present. Or you write \`//go:build linux,amd64\` intending AND, but comma means OR, so your code compiles on darwin/amd64 and fails at runtime. You waste time checking GOOS/GOARCH and file names before noticing the comment syntax. The fix works because Go 1.17 introduced the new constraint language; \`go fmt\` can translate old tags, but only if both forms are present and consistent, and the tag must be separated from the package clause by a blank line to be recognized as a build constraint rather than a package comment.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-13T10:55:42.546395+00:00— report_created — created