code: func (p *Pinger) Source(source string) (string, error) {
  	// using ipv4 previous value for new empty one
  	origSource := p.source
  	if "" == source {
  		p.mu.Lock()
  		p.source = ""
  		p.source6 = ""
  		p.mu.Unlock()
  		return origSource, nil
  	}
  
  	addr := net.ParseIP(source)
  	if addr == nil {
  		return origSource, errors.New(source + " is not a valid textual representation of an IPv4/IPv6 address")
  	}
  
  	if isIPv4(addr) {
  		p.mu.Lock()
  		p.source = source
  		p.mu.Unlock()
  	} else if isIPv6(addr) {
  		origSource = p.source6
  		p.mu.Lock()
  		p.source6 = source
  		p.mu.Unlock()
  	} else {
  		return origSource, errors.New(source + " is not a valid textual representation of an IPv4/IPv6 address")
  	}
  
  	return origSource, nil
  }
docs: // Source sets ipv4/ipv6 source IP for sending ICMP packets and returns the previous
  // setting. Empty value indicates to use system default one (for both ipv4 and ipv6).