code: func ValidateTags(tags []string) error {
  	if len(tags) > maxTagCount {
  		return fmt.Errorf("too many tags given (%d), expecting up to %d tags", len(tags), maxTagCount)
  	}
  	var merr errors.MultiError
  	for i, tag := range tags {
  		parts := strings.SplitN(tag, ":", 2) // ':' in values are allowed
  		msg := ""
  		switch {
  		case len(parts) != 2:
  			msg = "not in <key>:<value> form"
  		case len(parts[0]) > maxTagKeySize:
  			msg = fmt.Sprintf("the key length must not exceed %d", maxTagKeySize)
  		case len(parts[1]) > maxTagValueSize:
  			msg = fmt.Sprintf("the value length must not exceed %d", maxTagValueSize)
  		}
  		if msg != "" {
  			merr = append(merr, fmt.Errorf("tag #%d: %s", i+1, msg))
  		}
  	}
  	if len(merr) == 0 {
  		return nil
  	}
  	return merr
  }
docs: // ValidateTags returns an error if some tags are malformed.
  //
  // Tags are "key:value" pairs that can be passed with some RPCs. They end up
  // inside the tokens and/or BigQuery logs.