slog: split Value off from Attr

Move the value part of an Attr into its own type.

Besides making sense on general grounds--the key and
value are really independent of each other--it also
paves the way for

    type Marshaler interface {
        MarshalLog() Value
    }

which will provide a way for types to replace their
values for logging.

We considered having MarshalLog return Attr and ignore the key,
but this seems better.

The main negative consequence of this split is the duplication of
constructor functions. We use the longer XXXValue for Values, since
most people will construct Attrs, not Values. Fast switching on
generic type parameters (https://go.dev/issue/45380) would ameliorate
this, because we would need only one constructor function per type.

Change-Id: I974c5dba1bb0fbcd35aaf8e19f3a81daac6e8094
Reviewed-on: https://go-review.googlesource.com/c/exp/+/437956
Reviewed-by: Alan Donovan <adonovan@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
13 files changed
tree: 989ca619b0a1855851c6a8e17897befbc9d051fc
  1. apidiff/
  2. cmd/
  3. constraints/
  4. devtools/
  5. ebnf/
  6. ebnflint/
  7. errors/
  8. event/
  9. inotify/
  10. io/
  11. jsonrpc2/
  12. maps/
  13. mmap/
  14. rand/
  15. shiny/
  16. shootout/
  17. slices/
  18. slog/
  19. sumdb/
  20. typeparams/
  21. utf8string/
  22. .gitattributes
  23. .gitignore
  24. codereview.cfg
  25. CONTRIBUTING.md
  26. go.mod
  27. go.sum
  28. LICENSE
  29. PATENTS
  30. README.md
README.md

exp

PkgGoDev

This subrepository holds experimental and deprecated (in the old directory) packages.

The idea for this subrepository originated as the pkg/exp directory of the main repository, but its presence there made it unavailable to users of the binary downloads of the Go installation. The subrepository has therefore been created to make it possible to go get these packages.

Warning: Packages here are experimental and unreliable. Some may one day be promoted to the main repository or other subrepository, or they may be modified arbitrarily or even disappear altogether.

In short, code in this subrepository is not subject to the Go 1 compatibility promise. (No subrepo is, but the promise is even more likely to be violated by go.exp than the others.)

Caveat emptor.