code: func (s *Struct) structFields() []reflect.StructField {
  	t := s.value.Type()
  
  	var f []reflect.StructField
  
  	for i := 0; i < t.NumField(); i++ {
  		field := t.Field(i)
  		// we can't access the value of unexported fields
  		if field.PkgPath != "" {
  			continue
  		}
  
  		// don't check if it's omitted
  		if tag := field.Tag.Get(s.TagName); tag == "-" {
  			continue
  		}
  
  		f = append(f, field)
  	}
  
  	return f
  }
docs: // structFields returns the exported struct fields for a given s struct. This
  // is a convenient helper method to avoid duplicate code in some of the
  // functions.