Remix.run Logo
9rx 4 days ago

So what you want is slog, found in the standard library? The doc.go file found in the package even goes into detail about what you (seem to) describe and how it avoids that problem.

badc0ffee 4 days ago | parent [-]

A link to doc.go, for the lazy:

https://cs.opensource.google/go/x/exp/+/645b1fa8:slog/doc.go...

Basically it says to pass in objects, not prepared strings, so the formatted output is only computed if the message is actually logged. That object can be a struct implementing the LogValuer interface to do any required work/produce formatted output.

lanstin 4 days ago | parent [-]

Oh cool, I hadn't run into LogValuer, that's cool. And passing pointers to strings rather than strings, hmmm.

9rx 4 days ago | parent [-]

> And passing pointers to strings rather than strings, hmmm.

Are you referring to the "URL" example? That isn't a case of passing pointers to strings, that is passing a URL (fmt.Stringer) where the String method has a pointer receiver.

To demonstrate why the pointer would be needed in that case, consider:

    type URL struct{}
    func (*URL) String() string { return "https://..." }
    func print(v any)           { fmt.Println(v.(fmt.Stringer).String()) }
    func main() {
        print(&URL{}) // ok
        print(URL{})  // panic
    }