code: func (sct *ServiceChangeTracker) Update(previous, current *v1.Service) bool {
  	svc := current
  	if svc == nil {
  		svc = previous
  	}
  	// previous == nil && current == nil is unexpected, we should return false directly.
  	if svc == nil {
  		return false
  	}
  	namespacedName := types.NamespacedName{Namespace: svc.Namespace, Name: svc.Name}
  
  	sct.lock.Lock()
  	defer sct.lock.Unlock()
  
  	change, exists := sct.items[namespacedName]
  	if !exists {
  		change = &serviceChange{}
  		change.previous = sct.serviceToServiceMap(previous)
  		sct.items[namespacedName] = change
  	}
  	change.current = sct.serviceToServiceMap(current)
  	// if change.previous equal to change.current, it means no change
  	if reflect.DeepEqual(change.previous, change.current) {
  		delete(sct.items, namespacedName)
  	}
  	return len(sct.items) > 0
  }
docs: // Update updates given service's change map based on the <previous, current> service pair.  It returns true if items changed,
  // otherwise return false.  Update can be used to add/update/delete items of ServiceChangeMap.  For example,
  // Add item
  //   - pass <nil, service> as the <previous, current> pair.
  // Update item
  //   - pass <oldService, service> as the <previous, current> pair.
  // Delete item
  //   - pass <service, nil> as the <previous, current> pair.