Repository: go
Issue: cmd/go: unclear diagnostic when fetching requirements for other versions of workspace modules
Labels: NeedsInvestigation,GoCommand,modules

<!--
Please answer these questions before submitting your issue. Thanks!
-->

### What version of Go are you using (`go version`)?

<pre>
$ go version
go version go1.18.5 darwin/amd64
</pre>

### Does this issue reproduce with the latest release?
yes

### What operating system and processor architecture are you using (`go env`)?

<details><summary><code>go env</code> Output</summary><br><pre>
$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/mike/Library/Caches/go-build"
GOENV="/Users/mike/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/mike/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/mike/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/opt/go/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/opt/go/libexec/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.18.5"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK="/Users/mike/Code/go/go.work"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/8l/0qhz2jl149bdfk71_vsx2t6r0000gn/T/go-build3928123174=/tmp/go-build -gno-record-gcc-switches -fno-common"
</pre></details>

### What did you do?

<!--
If possible, provide a recipe for reproducing the error.
A complete runnable program is good.
A link on go.dev/play is best.
-->
`./go.work`
```go
go 1.18

use (
	./libs/foo
	./projects/bar
)
```

`./libs/foo/go.mod`
```go
module internal/foo

go 1.18
```

`./projects/bar/go.mod`
```go
module internal/bar

go 1.18

require internal/foo v0.0.0
```

### What did you expect to see?
Based on a number of expressive documents, the workspace proposal, and [the workspace tutorial](https://go.dev/doc/tutorial/workspaces), I thought workspaces would be an alternative to the current usage of the `replace` directive in multiple modules in the same source tree.


### What did you see instead?
While the module location usage of `replace` is changed for the workspace, the module name is enforced. This is not how `replace` works today in when specified in `go.mod`. There, it replaces the location and the module name. This results in the following error in the modules:

```
go: internal/foo@v0.0.0: malformed module path "internal/foo": missing dot in first path element
```

Again, this does not happen with the following in the `./projects/bar/go.mod`.
```go
module internal/bar

go 1.18

require internal/foo v0.0.0
replace internal/foo v0.0.0 => ../libs/foo
```

The workaround to this appears to be that a `replace` directive must also be in the `go.work`.
```go
go 1.18

use (
	./libs/foo
	./projects/bar
)

replace internal/foo v0.0.0 => ./libs/foo
```

However, it does seem that we're having to specify the override of the module name multiple times as it is in both the `go.work` file and the module's own `go.mod`. It took a bit of work to find this (before I saw an example of `replace` used [here](https://pkg.go.dev/cmd/go#hdr-Workspace_maintenance)) solution, and not really what I expected. But it does bring up the issue, if the module specifies its own name in `go.mod`, and the workspace knows how to access it, why do we need an explicit `replace` statement in the `go.work` to simply reassert the name of the module?