type Setting … type setting … type value … // New returns a new Setting for the $GODEBUG setting with the given name. // // GODEBUGs meant for use by end users must be listed in ../godebugs/table.go, // which is used for generating and checking various documentation. // If the name is not listed in that table, New will succeed but calling Value // on the returned Setting will panic. // To disable that panic for access to an undocumented setting, // prefix the name with a #, as in godebug.New("#gofsystrace"). // The # is a signal to New but not part of the key used in $GODEBUG. // // Note that almost all settings should arrange to call [IncNonDefault] precisely // when program behavior is changing from the default due to the setting // (not just when the setting is different, but when program behavior changes). // See the [internal/godebug] package comment for more. func New(name string) *Setting { … } // Name returns the name of the setting. func (s *Setting) Name() string { … } // Undocumented reports whether this is an undocumented setting. func (s *Setting) Undocumented() bool { … } // String returns a printable form for the setting: name=value. func (s *Setting) String() string { … } // IncNonDefault increments the non-default behavior counter // associated with the given setting. // This counter is exposed in the runtime/metrics value // /godebug/non-default-behavior/<name>:events. // // Note that Value must be called at least once before IncNonDefault. func (s *Setting) IncNonDefault() { … } func (s *Setting) register() { … } var cache … var empty … // Value returns the current value for the GODEBUG setting s. // // Value maintains an internal cache that is synchronized // with changes to the $GODEBUG environment variable, // making Value efficient to call as frequently as needed. // Clients should therefore typically not attempt their own // caching of Value's result. func (s *Setting) Value() string { … } // lookup returns the unique *setting value for the given name. func lookup(name string) *setting { … } // setUpdate is provided by package runtime. // It calls update(def, env), where def is the default GODEBUG setting // and env is the current value of the $GODEBUG environment variable. // After that first call, the runtime calls update(def, env) // again each time the environment variable changes // (due to use of os.Setenv, for example). // //go:linkname setUpdate func setUpdate(update func(string, string)) // registerMetric is provided by package runtime. // It forwards registrations to runtime/metrics. // //go:linkname registerMetric func registerMetric(name string, read func() uint64) // setNewIncNonDefault is provided by package runtime. // The runtime can do // // inc := newNonDefaultInc(name) // // instead of // // inc := godebug.New(name).IncNonDefault // // since it cannot import godebug. // //go:linkname setNewIncNonDefault func setNewIncNonDefault(newIncNonDefault func(string) func()) func init() { … } func newIncNonDefault(name string) func() { … } var updateMu … // update records an updated GODEBUG setting. // def is the default GODEBUG setting for the running binary, // and env is the current value of the $GODEBUG environment variable. func update(def, env string) { … } // parse parses the GODEBUG setting string s, // which has the form k=v,k2=v2,k3=v3. // Later settings override earlier ones. // Parse only updates settings k=v for which did[k] = false. // It also sets did[k] = true for settings that it updates. // Each value v can also have the form v#pattern, // in which case the GODEBUG is only enabled for call stacks // matching pattern, for use with golang.org/x/tools/cmd/bisect. func parse(did map[string]bool, s string) { … } type runtimeStderr … var stderr … func (*runtimeStderr) Write(b []byte) (int, error) { … } // Since we cannot import os or syscall, use the runtime's write function // to print to standard error. // //go:linkname write runtime.write func write(fd uintptr, p unsafe.Pointer, n int32) int32