code: func (c *Client) GetValues(keys []string) (map[string]string, error) {
  	vars := make(map[string]string)
  	for _, key := range keys {
  		// Check if we can find the single item
  		m := make(map[string]*dynamodb.AttributeValue)
  		m["key"] = &dynamodb.AttributeValue{S: aws.String(key)}
  		g, err := c.client.GetItem(&dynamodb.GetItemInput{Key: m, TableName: &c.table})
  		if err != nil {
  			return vars, err
  		}
  
  		if g.Item != nil {
  			if val, ok := g.Item["value"]; ok {
  				if val.S != nil {
  					vars[key] = *val.S
  				} else {
  					log.Warning("Skipping key '%s'. 'value' is not of type 'string'.", key)
  				}
  				continue
  			}
  		}
  
  		// Check for nested keys
  		q, err := c.client.Scan(
  			&dynamodb.ScanInput{
  				ScanFilter: map[string]*dynamodb.Condition{
  					"key": &dynamodb.Condition{
  						AttributeValueList: []*dynamodb.AttributeValue{
  							&dynamodb.AttributeValue{S: aws.String(key)}},
  						ComparisonOperator: aws.String("BEGINS_WITH")}},
  				AttributesToGet: []*string{aws.String("key"), aws.String("value")},
  				TableName:       aws.String(c.table),
  				Select:          aws.String("SPECIFIC_ATTRIBUTES"),
  			})
  
  		if err != nil {
  			return vars, err
  		}
  
  		for _, i := range q.Items {
  			item := i
  			if val, ok := item["value"]; ok {
  				if val.S != nil {
  					vars[*item["key"].S] = *val.S
  				} else {
  					log.Warning("Skipping key '%s'. 'value' is not of type 'string'.", *item["key"].S)
  				}
  				continue
  			}
  		}
  	}
  	return vars, nil
  }
docs: // GetValues retrieves the values for the given keys from DynamoDB