Source file
src/flag/flag.go
1
2
3
4
5
83 package flag
84
85 import (
86 "encoding"
87 "errors"
88 "fmt"
89 "io"
90 "os"
91 "reflect"
92 "sort"
93 "strconv"
94 "strings"
95 "time"
96 )
97
98
99
100 var ErrHelp = errors.New("flag: help requested")
101
102
103
104 var errParse = errors.New("parse error")
105
106
107
108 var errRange = errors.New("value out of range")
109
110 func numError(err error) error {
111 ne, ok := err.(*strconv.NumError)
112 if !ok {
113 return err
114 }
115 if ne.Err == strconv.ErrSyntax {
116 return errParse
117 }
118 if ne.Err == strconv.ErrRange {
119 return errRange
120 }
121 return err
122 }
123
124
125 type boolValue bool
126
127 func newBoolValue(val bool, p *bool) *boolValue {
128 *p = val
129 return (*boolValue)(p)
130 }
131
132 func (b *boolValue) Set(s string) error {
133 v, err := strconv.ParseBool(s)
134 if err != nil {
135 err = errParse
136 }
137 *b = boolValue(v)
138 return err
139 }
140
141 func (b *boolValue) Get() any { return bool(*b) }
142
143 func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) }
144
145 func (b *boolValue) IsBoolFlag() bool { return true }
146
147
148
149 type boolFlag interface {
150 Value
151 IsBoolFlag() bool
152 }
153
154
155 type intValue int
156
157 func newIntValue(val int, p *int) *intValue {
158 *p = val
159 return (*intValue)(p)
160 }
161
162 func (i *intValue) Set(s string) error {
163 v, err := strconv.ParseInt(s, 0, strconv.IntSize)
164 if err != nil {
165 err = numError(err)
166 }
167 *i = intValue(v)
168 return err
169 }
170
171 func (i *intValue) Get() any { return int(*i) }
172
173 func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
174
175
176 type int64Value int64
177
178 func newInt64Value(val int64, p *int64) *int64Value {
179 *p = val
180 return (*int64Value)(p)
181 }
182
183 func (i *int64Value) Set(s string) error {
184 v, err := strconv.ParseInt(s, 0, 64)
185 if err != nil {
186 err = numError(err)
187 }
188 *i = int64Value(v)
189 return err
190 }
191
192 func (i *int64Value) Get() any { return int64(*i) }
193
194 func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) }
195
196
197 type uintValue uint
198
199 func newUintValue(val uint, p *uint) *uintValue {
200 *p = val
201 return (*uintValue)(p)
202 }
203
204 func (i *uintValue) Set(s string) error {
205 v, err := strconv.ParseUint(s, 0, strconv.IntSize)
206 if err != nil {
207 err = numError(err)
208 }
209 *i = uintValue(v)
210 return err
211 }
212
213 func (i *uintValue) Get() any { return uint(*i) }
214
215 func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) }
216
217
218 type uint64Value uint64
219
220 func newUint64Value(val uint64, p *uint64) *uint64Value {
221 *p = val
222 return (*uint64Value)(p)
223 }
224
225 func (i *uint64Value) Set(s string) error {
226 v, err := strconv.ParseUint(s, 0, 64)
227 if err != nil {
228 err = numError(err)
229 }
230 *i = uint64Value(v)
231 return err
232 }
233
234 func (i *uint64Value) Get() any { return uint64(*i) }
235
236 func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
237
238
239 type stringValue string
240
241 func newStringValue(val string, p *string) *stringValue {
242 *p = val
243 return (*stringValue)(p)
244 }
245
246 func (s *stringValue) Set(val string) error {
247 *s = stringValue(val)
248 return nil
249 }
250
251 func (s *stringValue) Get() any { return string(*s) }
252
253 func (s *stringValue) String() string { return string(*s) }
254
255
256 type float64Value float64
257
258 func newFloat64Value(val float64, p *float64) *float64Value {
259 *p = val
260 return (*float64Value)(p)
261 }
262
263 func (f *float64Value) Set(s string) error {
264 v, err := strconv.ParseFloat(s, 64)
265 if err != nil {
266 err = numError(err)
267 }
268 *f = float64Value(v)
269 return err
270 }
271
272 func (f *float64Value) Get() any { return float64(*f) }
273
274 func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }
275
276
277 type durationValue time.Duration
278
279 func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
280 *p = val
281 return (*durationValue)(p)
282 }
283
284 func (d *durationValue) Set(s string) error {
285 v, err := time.ParseDuration(s)
286 if err != nil {
287 err = errParse
288 }
289 *d = durationValue(v)
290 return err
291 }
292
293 func (d *durationValue) Get() any { return time.Duration(*d) }
294
295 func (d *durationValue) String() string { return (*time.Duration)(d).String() }
296
297
298 type textValue struct{ p encoding.TextUnmarshaler }
299
300 func newTextValue(val encoding.TextMarshaler, p encoding.TextUnmarshaler) textValue {
301 ptrVal := reflect.ValueOf(p)
302 if ptrVal.Kind() != reflect.Ptr {
303 panic("variable value type must be a pointer")
304 }
305 defVal := reflect.ValueOf(val)
306 if defVal.Kind() == reflect.Ptr {
307 defVal = defVal.Elem()
308 }
309 if defVal.Type() != ptrVal.Type().Elem() {
310 panic(fmt.Sprintf("default type does not match variable type: %v != %v", defVal.Type(), ptrVal.Type().Elem()))
311 }
312 ptrVal.Elem().Set(defVal)
313 return textValue{p}
314 }
315
316 func (v textValue) Set(s string) error {
317 return v.p.UnmarshalText([]byte(s))
318 }
319
320 func (v textValue) Get() interface{} {
321 return v.p
322 }
323
324 func (v textValue) String() string {
325 if m, ok := v.p.(encoding.TextMarshaler); ok {
326 if b, err := m.MarshalText(); err == nil {
327 return string(b)
328 }
329 }
330 return ""
331 }
332
333
334 type funcValue func(string) error
335
336 func (f funcValue) Set(s string) error { return f(s) }
337
338 func (f funcValue) String() string { return "" }
339
340
341
342
343
344
345
346
347
348
349
350 type Value interface {
351 String() string
352 Set(string) error
353 }
354
355
356
357
358
359 type Getter interface {
360 Value
361 Get() any
362 }
363
364
365 type ErrorHandling int
366
367
368 const (
369 ContinueOnError ErrorHandling = iota
370 ExitOnError
371 PanicOnError
372 )
373
374
375
376
377
378
379 type FlagSet struct {
380
381
382
383
384
385 Usage func()
386
387 name string
388 parsed bool
389 actual map[string]*Flag
390 formal map[string]*Flag
391 args []string
392 errorHandling ErrorHandling
393 output io.Writer
394 }
395
396
397 type Flag struct {
398 Name string
399 Usage string
400 Value Value
401 DefValue string
402 }
403
404
405 func sortFlags(flags map[string]*Flag) []*Flag {
406 result := make([]*Flag, len(flags))
407 i := 0
408 for _, f := range flags {
409 result[i] = f
410 i++
411 }
412 sort.Slice(result, func(i, j int) bool {
413 return result[i].Name < result[j].Name
414 })
415 return result
416 }
417
418
419
420 func (f *FlagSet) Output() io.Writer {
421 if f.output == nil {
422 return os.Stderr
423 }
424 return f.output
425 }
426
427
428 func (f *FlagSet) Name() string {
429 return f.name
430 }
431
432
433 func (f *FlagSet) ErrorHandling() ErrorHandling {
434 return f.errorHandling
435 }
436
437
438
439 func (f *FlagSet) SetOutput(output io.Writer) {
440 f.output = output
441 }
442
443
444
445 func (f *FlagSet) VisitAll(fn func(*Flag)) {
446 for _, flag := range sortFlags(f.formal) {
447 fn(flag)
448 }
449 }
450
451
452
453 func VisitAll(fn func(*Flag)) {
454 CommandLine.VisitAll(fn)
455 }
456
457
458
459 func (f *FlagSet) Visit(fn func(*Flag)) {
460 for _, flag := range sortFlags(f.actual) {
461 fn(flag)
462 }
463 }
464
465
466
467 func Visit(fn func(*Flag)) {
468 CommandLine.Visit(fn)
469 }
470
471
472 func (f *FlagSet) Lookup(name string) *Flag {
473 return f.formal[name]
474 }
475
476
477
478 func Lookup(name string) *Flag {
479 return CommandLine.formal[name]
480 }
481
482
483 func (f *FlagSet) Set(name, value string) error {
484 flag, ok := f.formal[name]
485 if !ok {
486 return fmt.Errorf("no such flag -%v", name)
487 }
488 err := flag.Value.Set(value)
489 if err != nil {
490 return err
491 }
492 if f.actual == nil {
493 f.actual = make(map[string]*Flag)
494 }
495 f.actual[name] = flag
496 return nil
497 }
498
499
500 func Set(name, value string) error {
501 return CommandLine.Set(name, value)
502 }
503
504
505
506 func isZeroValue(flag *Flag, value string) (ok bool, err error) {
507
508
509
510 typ := reflect.TypeOf(flag.Value)
511 var z reflect.Value
512 if typ.Kind() == reflect.Pointer {
513 z = reflect.New(typ.Elem())
514 } else {
515 z = reflect.Zero(typ)
516 }
517
518
519
520 defer func() {
521 if e := recover(); e != nil {
522 if typ.Kind() == reflect.Pointer {
523 typ = typ.Elem()
524 }
525 err = fmt.Errorf("panic calling String method on zero %v for flag %s: %v", typ, flag.Name, e)
526 }
527 }()
528 return value == z.Interface().(Value).String(), nil
529 }
530
531
532
533
534
535
536 func UnquoteUsage(flag *Flag) (name string, usage string) {
537
538 usage = flag.Usage
539 for i := 0; i < len(usage); i++ {
540 if usage[i] == '`' {
541 for j := i + 1; j < len(usage); j++ {
542 if usage[j] == '`' {
543 name = usage[i+1 : j]
544 usage = usage[:i] + name + usage[j+1:]
545 return name, usage
546 }
547 }
548 break
549 }
550 }
551
552 name = "value"
553 switch fv := flag.Value.(type) {
554 case boolFlag:
555 if fv.IsBoolFlag() {
556 name = ""
557 }
558 case *durationValue:
559 name = "duration"
560 case *float64Value:
561 name = "float"
562 case *intValue, *int64Value:
563 name = "int"
564 case *stringValue:
565 name = "string"
566 case *uintValue, *uint64Value:
567 name = "uint"
568 }
569 return
570 }
571
572
573
574
575 func (f *FlagSet) PrintDefaults() {
576 var isZeroValueErrs []error
577 f.VisitAll(func(flag *Flag) {
578 var b strings.Builder
579 fmt.Fprintf(&b, " -%s", flag.Name)
580 name, usage := UnquoteUsage(flag)
581 if len(name) > 0 {
582 b.WriteString(" ")
583 b.WriteString(name)
584 }
585
586
587 if b.Len() <= 4 {
588 b.WriteString("\t")
589 } else {
590
591
592 b.WriteString("\n \t")
593 }
594 b.WriteString(strings.ReplaceAll(usage, "\n", "\n \t"))
595
596
597
598 if isZero, err := isZeroValue(flag, flag.DefValue); err != nil {
599 isZeroValueErrs = append(isZeroValueErrs, err)
600 } else if !isZero {
601 if _, ok := flag.Value.(*stringValue); ok {
602
603 fmt.Fprintf(&b, " (default %q)", flag.DefValue)
604 } else {
605 fmt.Fprintf(&b, " (default %v)", flag.DefValue)
606 }
607 }
608 fmt.Fprint(f.Output(), b.String(), "\n")
609 })
610
611
612
613 if errs := isZeroValueErrs; len(errs) > 0 {
614 fmt.Fprintln(f.Output())
615 for _, err := range errs {
616 fmt.Fprintln(f.Output(), err)
617 }
618 }
619 }
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647 func PrintDefaults() {
648 CommandLine.PrintDefaults()
649 }
650
651
652 func (f *FlagSet) defaultUsage() {
653 if f.name == "" {
654 fmt.Fprintf(f.Output(), "Usage:\n")
655 } else {
656 fmt.Fprintf(f.Output(), "Usage of %s:\n", f.name)
657 }
658 f.PrintDefaults()
659 }
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674 var Usage = func() {
675 fmt.Fprintf(CommandLine.Output(), "Usage of %s:\n", os.Args[0])
676 PrintDefaults()
677 }
678
679
680 func (f *FlagSet) NFlag() int { return len(f.actual) }
681
682
683 func NFlag() int { return len(CommandLine.actual) }
684
685
686
687
688 func (f *FlagSet) Arg(i int) string {
689 if i < 0 || i >= len(f.args) {
690 return ""
691 }
692 return f.args[i]
693 }
694
695
696
697
698 func Arg(i int) string {
699 return CommandLine.Arg(i)
700 }
701
702
703 func (f *FlagSet) NArg() int { return len(f.args) }
704
705
706 func NArg() int { return len(CommandLine.args) }
707
708
709 func (f *FlagSet) Args() []string { return f.args }
710
711
712 func Args() []string { return CommandLine.args }
713
714
715
716 func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
717 f.Var(newBoolValue(value, p), name, usage)
718 }
719
720
721
722 func BoolVar(p *bool, name string, value bool, usage string) {
723 CommandLine.Var(newBoolValue(value, p), name, usage)
724 }
725
726
727
728 func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
729 p := new(bool)
730 f.BoolVar(p, name, value, usage)
731 return p
732 }
733
734
735
736 func Bool(name string, value bool, usage string) *bool {
737 return CommandLine.Bool(name, value, usage)
738 }
739
740
741
742 func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
743 f.Var(newIntValue(value, p), name, usage)
744 }
745
746
747
748 func IntVar(p *int, name string, value int, usage string) {
749 CommandLine.Var(newIntValue(value, p), name, usage)
750 }
751
752
753
754 func (f *FlagSet) Int(name string, value int, usage string) *int {
755 p := new(int)
756 f.IntVar(p, name, value, usage)
757 return p
758 }
759
760
761
762 func Int(name string, value int, usage string) *int {
763 return CommandLine.Int(name, value, usage)
764 }
765
766
767
768 func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
769 f.Var(newInt64Value(value, p), name, usage)
770 }
771
772
773
774 func Int64Var(p *int64, name string, value int64, usage string) {
775 CommandLine.Var(newInt64Value(value, p), name, usage)
776 }
777
778
779
780 func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
781 p := new(int64)
782 f.Int64Var(p, name, value, usage)
783 return p
784 }
785
786
787
788 func Int64(name string, value int64, usage string) *int64 {
789 return CommandLine.Int64(name, value, usage)
790 }
791
792
793
794 func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
795 f.Var(newUintValue(value, p), name, usage)
796 }
797
798
799
800 func UintVar(p *uint, name string, value uint, usage string) {
801 CommandLine.Var(newUintValue(value, p), name, usage)
802 }
803
804
805
806 func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
807 p := new(uint)
808 f.UintVar(p, name, value, usage)
809 return p
810 }
811
812
813
814 func Uint(name string, value uint, usage string) *uint {
815 return CommandLine.Uint(name, value, usage)
816 }
817
818
819
820 func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
821 f.Var(newUint64Value(value, p), name, usage)
822 }
823
824
825
826 func Uint64Var(p *uint64, name string, value uint64, usage string) {
827 CommandLine.Var(newUint64Value(value, p), name, usage)
828 }
829
830
831
832 func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
833 p := new(uint64)
834 f.Uint64Var(p, name, value, usage)
835 return p
836 }
837
838
839
840 func Uint64(name string, value uint64, usage string) *uint64 {
841 return CommandLine.Uint64(name, value, usage)
842 }
843
844
845
846 func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
847 f.Var(newStringValue(value, p), name, usage)
848 }
849
850
851
852 func StringVar(p *string, name string, value string, usage string) {
853 CommandLine.Var(newStringValue(value, p), name, usage)
854 }
855
856
857
858 func (f *FlagSet) String(name string, value string, usage string) *string {
859 p := new(string)
860 f.StringVar(p, name, value, usage)
861 return p
862 }
863
864
865
866 func String(name string, value string, usage string) *string {
867 return CommandLine.String(name, value, usage)
868 }
869
870
871
872 func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
873 f.Var(newFloat64Value(value, p), name, usage)
874 }
875
876
877
878 func Float64Var(p *float64, name string, value float64, usage string) {
879 CommandLine.Var(newFloat64Value(value, p), name, usage)
880 }
881
882
883
884 func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
885 p := new(float64)
886 f.Float64Var(p, name, value, usage)
887 return p
888 }
889
890
891
892 func Float64(name string, value float64, usage string) *float64 {
893 return CommandLine.Float64(name, value, usage)
894 }
895
896
897
898
899 func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
900 f.Var(newDurationValue(value, p), name, usage)
901 }
902
903
904
905
906 func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
907 CommandLine.Var(newDurationValue(value, p), name, usage)
908 }
909
910
911
912
913 func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
914 p := new(time.Duration)
915 f.DurationVar(p, name, value, usage)
916 return p
917 }
918
919
920
921
922 func Duration(name string, value time.Duration, usage string) *time.Duration {
923 return CommandLine.Duration(name, value, usage)
924 }
925
926
927
928
929
930
931 func (f *FlagSet) TextVar(p encoding.TextUnmarshaler, name string, value encoding.TextMarshaler, usage string) {
932 f.Var(newTextValue(value, p), name, usage)
933 }
934
935
936
937
938
939
940 func TextVar(p encoding.TextUnmarshaler, name string, value encoding.TextMarshaler, usage string) {
941 CommandLine.Var(newTextValue(value, p), name, usage)
942 }
943
944
945
946
947 func (f *FlagSet) Func(name, usage string, fn func(string) error) {
948 f.Var(funcValue(fn), name, usage)
949 }
950
951
952
953
954 func Func(name, usage string, fn func(string) error) {
955 CommandLine.Func(name, usage, fn)
956 }
957
958
959
960
961
962
963
964 func (f *FlagSet) Var(value Value, name string, usage string) {
965
966 if strings.HasPrefix(name, "-") {
967 panic(f.sprintf("flag %q begins with -", name))
968 } else if strings.Contains(name, "=") {
969 panic(f.sprintf("flag %q contains =", name))
970 }
971
972
973 flag := &Flag{name, usage, value, value.String()}
974 _, alreadythere := f.formal[name]
975 if alreadythere {
976 var msg string
977 if f.name == "" {
978 msg = f.sprintf("flag redefined: %s", name)
979 } else {
980 msg = f.sprintf("%s flag redefined: %s", f.name, name)
981 }
982 panic(msg)
983 }
984 if f.formal == nil {
985 f.formal = make(map[string]*Flag)
986 }
987 f.formal[name] = flag
988 }
989
990
991
992
993
994
995
996 func Var(value Value, name string, usage string) {
997 CommandLine.Var(value, name, usage)
998 }
999
1000
1001 func (f *FlagSet) sprintf(format string, a ...any) string {
1002 msg := fmt.Sprintf(format, a...)
1003 fmt.Fprintln(f.Output(), msg)
1004 return msg
1005 }
1006
1007
1008
1009 func (f *FlagSet) failf(format string, a ...any) error {
1010 msg := f.sprintf(format, a...)
1011 f.usage()
1012 return errors.New(msg)
1013 }
1014
1015
1016
1017 func (f *FlagSet) usage() {
1018 if f.Usage == nil {
1019 f.defaultUsage()
1020 } else {
1021 f.Usage()
1022 }
1023 }
1024
1025
1026 func (f *FlagSet) parseOne() (bool, error) {
1027 if len(f.args) == 0 {
1028 return false, nil
1029 }
1030 s := f.args[0]
1031 if len(s) < 2 || s[0] != '-' {
1032 return false, nil
1033 }
1034 numMinuses := 1
1035 if s[1] == '-' {
1036 numMinuses++
1037 if len(s) == 2 {
1038 f.args = f.args[1:]
1039 return false, nil
1040 }
1041 }
1042 name := s[numMinuses:]
1043 if len(name) == 0 || name[0] == '-' || name[0] == '=' {
1044 return false, f.failf("bad flag syntax: %s", s)
1045 }
1046
1047
1048 f.args = f.args[1:]
1049 hasValue := false
1050 value := ""
1051 for i := 1; i < len(name); i++ {
1052 if name[i] == '=' {
1053 value = name[i+1:]
1054 hasValue = true
1055 name = name[0:i]
1056 break
1057 }
1058 }
1059
1060 flag, ok := f.formal[name]
1061 if !ok {
1062 if name == "help" || name == "h" {
1063 f.usage()
1064 return false, ErrHelp
1065 }
1066 return false, f.failf("flag provided but not defined: -%s", name)
1067 }
1068
1069 if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() {
1070 if hasValue {
1071 if err := fv.Set(value); err != nil {
1072 return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
1073 }
1074 } else {
1075 if err := fv.Set("true"); err != nil {
1076 return false, f.failf("invalid boolean flag %s: %v", name, err)
1077 }
1078 }
1079 } else {
1080
1081 if !hasValue && len(f.args) > 0 {
1082
1083 hasValue = true
1084 value, f.args = f.args[0], f.args[1:]
1085 }
1086 if !hasValue {
1087 return false, f.failf("flag needs an argument: -%s", name)
1088 }
1089 if err := flag.Value.Set(value); err != nil {
1090 return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
1091 }
1092 }
1093 if f.actual == nil {
1094 f.actual = make(map[string]*Flag)
1095 }
1096 f.actual[name] = flag
1097 return true, nil
1098 }
1099
1100
1101
1102
1103
1104 func (f *FlagSet) Parse(arguments []string) error {
1105 f.parsed = true
1106 f.args = arguments
1107 for {
1108 seen, err := f.parseOne()
1109 if seen {
1110 continue
1111 }
1112 if err == nil {
1113 break
1114 }
1115 switch f.errorHandling {
1116 case ContinueOnError:
1117 return err
1118 case ExitOnError:
1119 if err == ErrHelp {
1120 os.Exit(0)
1121 }
1122 os.Exit(2)
1123 case PanicOnError:
1124 panic(err)
1125 }
1126 }
1127 return nil
1128 }
1129
1130
1131 func (f *FlagSet) Parsed() bool {
1132 return f.parsed
1133 }
1134
1135
1136
1137 func Parse() {
1138
1139 CommandLine.Parse(os.Args[1:])
1140 }
1141
1142
1143 func Parsed() bool {
1144 return CommandLine.Parsed()
1145 }
1146
1147
1148
1149
1150 var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
1151
1152 func init() {
1153
1154
1155
1156
1157 CommandLine.Usage = commandLineUsage
1158 }
1159
1160 func commandLineUsage() {
1161 Usage()
1162 }
1163
1164
1165
1166
1167 func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
1168 f := &FlagSet{
1169 name: name,
1170 errorHandling: errorHandling,
1171 }
1172 f.Usage = f.defaultUsage
1173 return f
1174 }
1175
1176
1177
1178
1179 func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
1180 f.name = name
1181 f.errorHandling = errorHandling
1182 }
1183
View as plain text