It's difficult to provide an example without the full context, but in general I think you may be testing at too low of a level.
For example, if I were testing a program that used a TCP Listener / Conn pattern, I would do so by starting the server in a goroutine, making actual connections to it, and testing the results. It might have a select case:
var DefaultTimeout = time.Second * 5
func someFunc() {
for {
c := make(chan result)
go doWork(c)
select {
case r := <-c:
case <-time.After(DefaultTimeout):
}
}
}
For testing the first select case I would have it just do a regular request / response cycle. For the timeout case I would set the DefaultTimeout to something very small, make the request and confirm that whatever I expect to happen on timeout actually happened.
You can then rely on the code coverage tool to make sure each path is covered by some test. Even though the structure of your tests won't look anything like the structure of your code it is indeed testing everything. In general the goal is to cover the functionality not the incidental details of implementation.
Another thing to keep in mind with this is I would break up the actual implementation code (what you do for each case) from the glue code (your for / select loop). You can test the implementation in a much more straightforward way (given X function F does Y), and then only have a few tests for the code as a whole.
If you have a separate integration test suite, you may find you don't even need this outer test. Curling URLs may expose any errors you made at that level.