code: func (p Pget) Assignment(grp *errgroup.Group, procs, split uint) {
  	filename := p.FileName()
  	dirname := p.DirName()
  
  	assignment := uint(p.Procs / len(p.TargetURLs))
  
  	var lasturl string
  	totalActiveProcs := uint(0)
  	for i := uint(0); i < procs; i++ {
  		partName := fmt.Sprintf("%s/%s.%d.%d", dirname, filename, procs, i)
  
  		// make range
  		r := p.Utils.MakeRange(i, split, procs)
  
  		if info, err := os.Stat(partName); err == nil {
  			infosize := uint(info.Size())
  			// check if the part is fully downloaded
  			if isLastProc(i, procs) {
  				if infosize == r.high-r.low {
  					continue
  				}
  			} else if infosize == split {
  				// skip as the part is already downloaded
  				continue
  			}
  
  			// make low range from this next byte
  			r.low += infosize
  		}
  
  		totalActiveProcs++
  
  		url := p.TargetURLs[0]
  
  		// give efficiency and equality work
  		if totalActiveProcs%assignment == 0 {
  			// Like shift method
  			if len(p.TargetURLs) > 1 {
  				p.TargetURLs = p.TargetURLs[1:]
  			}
  
  			// check whether to output the message
  			if lasturl != url {
  				fmt.Fprintf(os.Stdout, "Download start from %s\n", url)
  				lasturl = url
  			}
  		}
  
  		// execute get request
  		grp.Go(func() error {
  			return p.Requests(r, filename, dirname, url)
  		})
  	}
  }
docs: // Assignment method that to each goroutine gives the task