code: func (b *Builder) expandAddrs(name string, s *string) []net.Addr {
  	if s == nil || *s == "" {
  		return nil
  	}
  
  	x, err := template.Parse(*s)
  	if err != nil {
  		b.err = multierror.Append(b.err, fmt.Errorf("%s: error parsing %q: %s", name, *s, err))
  		return nil
  	}
  
  	var addrs []net.Addr
  	for _, a := range strings.Fields(x) {
  		switch {
  		case strings.HasPrefix(a, "unix://"):
  			addrs = append(addrs, &net.UnixAddr{Name: a[len("unix://"):], Net: "unix"})
  		default:
  			// net.ParseIP does not like '[::]'
  			ip := net.ParseIP(a)
  			if a == "[::]" {
  				ip = net.ParseIP("::")
  			}
  			if ip == nil {
  				b.err = multierror.Append(b.err, fmt.Errorf("%s: invalid ip address: %s", name, a))
  				return nil
  			}
  			addrs = append(addrs, &net.IPAddr{IP: ip})
  		}
  	}
  
  	return addrs
  }
docs: // expandAddrs expands the go-sockaddr template in s and returns the
  // result as a list of *net.IPAddr and *net.UnixAddr.