샘플
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
이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다.
통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다.
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")
}
}