サンプル
github.com/spf13/pflag v1.0.10: Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used
検証済みサンプル — golang github.com/spf13/pflag v1.0.10: Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated…
sha256:cc2c397664e089bf5638765dcfb834232cd669f9970283902c9b8947b773b043
このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。
合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。
MIT-0
実行証拠
宣言された環境と署名済みの実行を分けてあります。このサンプルが何をどこで実行したかをそのまま確認できます。
- 証拠の基準
- 署名済みコントラクト合格
- 検証レシート
- 2
- ビルドした署名鍵
- 2
宣言された環境
go linux x64 go go go
検証実行環境
| 環境 | コントラクト | ステージ | 実行日 |
|---|---|---|---|
| go 1.26 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · golang@1 |
2026-08-16 |
| go 1.26 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · golang@1 |
2026-08-18 |
ケース
HOW- ゴール
- Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used
- シンボル
-
- pflag.FlagSet.StringVarP
- pflag.FlagSet.Lookup
- pflag.Flag.NoOptDefVal
- pflag.FlagSet.Parse
- pflag.FlagSet.Args
- pflag.FlagSet.Changed
- 環境
- go
- 作成日
- 2026-08-16T12:28:14Z
コントラクト
- fs.Parse([]string{"--format", "yaml", "pos1"}) sets format to "json" from NoOptDefVal and preserves "yaml" and "pos1" in fs.Args()
- fs.Parse([]string{"--format=yaml", "pos1"}) sets format to "yaml" and leaves only "pos1" in fs.Args()
- fs.Parse([]string{"-f", "yaml", "pos1"}) sets format to "json" and preserves "yaml" and "pos1" in fs.Args()
- fs.Parse([]string{"-f=yaml", "pos1"}) sets format to "yaml" and leaves only "pos1" in fs.Args()
- fs.Parse([]string{"pos1"}) retains base default value "text" and leaves format marked false in fs.Changed()
- fs.Parse([]string{"--format"}) sets format to "json" and marks format as true in fs.Changed()
ファイル
- NOTES.md
- csx.json
- go.mod
- go.sum
- pflag_test.go
ソース
# Flag Parsing with NoOptDefVal
## Search Results
`search_known_solution` returned no prior samples for `github.com/spf13/pflag`.
## Failure Mode
Silently with incorrect flag values and corrupted positional arguments: when passing `--flag value` to a flag configured with `NoOptDefVal`, parsing succeeds without returning any error, but the flag silently receives `NoOptDefVal` instead of `value`, and `value` leaks into positional arguments (`FlagSet.Args()`), displacing positional parameter ordering.
{"case":{"believed":"a flag with NoOptDefVal set binds a subsequent space-separated argument as its value during command-line parsing","caseId":"case:sha256:8ca81009e12e289b160e6bd27d6f65da7e3046c116c1c8dbe1cff7dc2ae87ffc","contract":["fs.Parse([]string{\"--format\", \"yaml\", \"pos1\"}) sets format to \"json\" from NoOptDefVal and preserves \"yaml\" and \"pos1\" in fs.Args()","fs.Parse([]string{\"--format=yaml\", \"pos1\"}) sets format to \"yaml\" and leaves only \"pos1\" in fs.Args()","fs.Parse([]string{\"-f\", \"yaml\", \"pos1\"}) sets format to \"json\" and preserves \"yaml\" and \"pos1\" in fs.Args()","fs.Parse([]string{\"-f=yaml\", \"pos1\"}) sets format to \"yaml\" and leaves only \"pos1\" in fs.Args()","fs.Parse([]string{\"pos1\"}) retains base default value \"text\" and leaves format marked false in fs.Changed()","fs.Parse([]string{\"--format\"}) sets format to \"json\" and marks format as true in fs.Changed()"],"goal":"Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used","kind":"HOW","packages":["pkg:golang/github.com/spf13/pflag@1.0.10"],"schemaVersion":1,"symbols":["pflag.FlagSet.StringVarP","pflag.FlagSet.Lookup","pflag.Flag.NoOptDefVal","pflag.FlagSet.Parse","pflag.FlagSet.Args","pflag.FlagSet.Changed"]},"contractCommand":["go","test","./..."],"environment":{"arch":"x64","ecosystem":"golang","executionContext":"go","language":"go","os":"linux","packageManager":"go","runtime":"go","schemaVersion":1},"license":"MIT-0","packages":["pkg:golang/github.com/spf13/pflag@1.0.10"],"schemaVersion":1,"symbols":["pflag.FlagSet.StringVarP","pflag.FlagSet.Lookup","pflag.Flag.NoOptDefVal","pflag.FlagSet.Parse","pflag.FlagSet.Args","pflag.FlagSet.Changed"],"verifierAdapter":"golang@1"}
module example.com/pflagsample
go 1.26.5
require github.com/spf13/pflag v1.0.10
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
package pflagsample
import (
"reflect"
"testing"
"github.com/spf13/pflag"
)
func newTestFlagSet() (*pflag.FlagSet, *string) {
fs := pflag.NewFlagSet("sample", pflag.ContinueOnError)
var format string
fs.StringVarP(&format, "format", "f", "text", "output format")
fs.Lookup("format").NoOptDefVal = "json"
return fs, &format
}
func TestNoOptDefValSpaceSeparatedArgumentLeakedToPositional(t *testing.T) {
fs, format := newTestFlagSet()
// Naive expectation: "--format", "yaml" consumes "yaml" as the flag value.
// Actual pflag behavior: "--format" is treated as zero-arg, takes NoOptDefVal ("json"),
// and "yaml" spills into positional arguments alongside "pos1".
err := fs.Parse([]string{"--format", "yaml", "pos1"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "json" {
t.Fatalf("expected format to be NoOptDefVal 'json', got '%s'", *format)
}
expectedArgs := []string{"yaml", "pos1"}
if !reflect.DeepEqual(fs.Args(), expectedArgs) {
t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
}
if !fs.Changed("format") {
t.Fatalf("expected format flag to be marked as changed")
}
}
func TestNoOptDefValExplicitEqualsSyntax(t *testing.T) {
fs, format := newTestFlagSet()
// To pass a custom value to a flag with NoOptDefVal, caller must use "--flag=value".
err := fs.Parse([]string{"--format=yaml", "pos1"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "yaml" {
t.Fatalf("expected format 'yaml', got '%s'", *format)
}
expectedArgs := []string{"pos1"}
if !reflect.DeepEqual(fs.Args(), expectedArgs) {
t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
}
if !fs.Changed("format") {
t.Fatalf("expected format flag to be marked as changed")
}
}
func TestNoOptDefValShorthandSpaceSeparatedArgument(t *testing.T) {
fs, format := newTestFlagSet()
// Shorthand "-f", "yaml" also treats "-f" as zero-arg, assigning NoOptDefVal ("json")
// and leaving "yaml" and "pos1" in positional arguments.
err := fs.Parse([]string{"-f", "yaml", "pos1"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "json" {
t.Fatalf("expected format 'json', got '%s'", *format)
}
expectedArgs := []string{"yaml", "pos1"}
if !reflect.DeepEqual(fs.Args(), expectedArgs) {
t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
}
}
func TestNoOptDefValShorthandExplicitEqualsSyntax(t *testing.T) {
fs, format := newTestFlagSet()
// Shorthand with equals "-f=yaml" assigns custom value "yaml".
err := fs.Parse([]string{"-f=yaml", "pos1"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "yaml" {
t.Fatalf("expected format 'yaml', got '%s'", *format)
}
expectedArgs := []string{"pos1"}
if !reflect.DeepEqual(fs.Args(), expectedArgs) {
t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
}
}
func TestNoOptDefValOmittedFlagRetainsBaseDefault(t *testing.T) {
fs, format := newTestFlagSet()
// When flag is omitted entirely, it retains base default ("text"), NOT NoOptDefVal ("json").
err := fs.Parse([]string{"pos1"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "text" {
t.Fatalf("expected format 'text', got '%s'", *format)
}
expectedArgs := []string{"pos1"}
if !reflect.DeepEqual(fs.Args(), expectedArgs) {
t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
}
if fs.Changed("format") {
t.Fatalf("expected omitted flag to NOT be marked as changed")
}
}
func TestNoOptDefValStandaloneFlagReceivesNoOptDefVal(t *testing.T) {
fs, format := newTestFlagSet()
// When passed alone without arguments, flag receives NoOptDefVal ("json").
err := fs.Parse([]string{"--format"})
if err != nil {
t.Fatalf("unexpected parse error: %v", err)
}
if *format != "json" {
t.Fatalf("expected format 'json', got '%s'", *format)
}
if len(fs.Args()) != 0 {
t.Fatalf("expected empty args, got %v", fs.Args())
}
if !fs.Changed("format") {
t.Fatalf("expected standalone flag to be marked as changed")
}
}