I'm trying to complete this exercise in the Tour of Go, https://tour.golang.org/methods/18, to implement a String() method for an IPAddr type consisting of an array of four bytes. So far I've tried:
package main
import (
    "fmt"
    "strings"
)
type IPAddr [4]byte
func (ipaddr IPAddr) String() string {
    ipaddrStrings := make([]string, 4)
    for i, b := range ipaddr {
        ipaddrStrings[i] = string(b)
    }
    return strings.Join(ipaddrStrings, ".")
}
func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, ip)
    }
}
However, this prints
loopback: ...
googleDNS:.
I've also tried, following https://programming.guide/go/convert-byte-slice-to-string.html, to do string(ipaddr), but this results in a
cannot convert ipaddr (type IPAddr) to type string
How can I complete this exercise?

string(ipaddr[:])seems to just return an empty string. Also, according to en.wikipedia.org/wiki/IP_address#IPv4_addresses, an IPv4 address consists of 32 bits or 4 bytes, so I believe the problem is stated realistically.