TBQH the word "mutable" doesn't make a lot of sense in Go (even though the spec also calls strings "immutable").
Arguably, *all* values in Go are immutable. It's just that all *pointers* in Go allow to modify the referenced variables - and some types allow you to get a pointer to a shared variable, which strings don't.
That is, a `[]byte` is immutable - you have to write `x = append(x, v)` specifically because `append` creates a new slice value and overwrites the variable `x` with it.
However, a `[]byte` refers to an underlying array and `&b[0]` allows you to obtain a pointer to that underlying array. So a `[]byte` represents a reference and that reference allows to mutate the referenced storage location. The same goes for a `*T`, a `map[K]V`, or a `type S struct{ X int; P *int }` - `S` itself is immutable, but `S.X` is a reference to some potentially shared variable.
A `string` meanwhile, does not allow you to obtain a pointer to the underlying storage and that's what makes it "immutable". And that does indeed mean that if you pass a `string` value around, that can't lead to data races, while passing a `[]byte` around *might*.
But for this case, it doesn't really matter whether or not the field is a `string` or a `[]byte` or an `int`: Because the "mutable" type is the `*URL`. Which represents a reference to some underlying `URL` variable, that you can then mutate. The race happens because you have a method on a pointer that mutates a field - *regardless* of the type of that field.
I don't know if that helps, it's a bit subtle.