Parsing and Updating Complex String Maps in Go

Introduction

Hello, and welcome back! Are you ready for a new challenge? In this unit, we're stepping up to tackle a complex yet intriguing task. It involves parsing complex strings into a Go map[string]interface{} and then updating them, which is a common requirement in many real-world tasks. So yes, this unit's session is going to be pretty pragmatic — just the way you like it!

Task Statement

This task involves transforming a given string into a nested map[string]interface{} and updating a specific key-value pair within that map. The input string will take the form "Key1=Value1,Key2=Value2,...". When a part of the value is another key-value string, we create a nested map.

For example, the string "A1=B1,C1={D1=E1,F1=G1},I1=J1" should be transformed into the following map:

map[string]interface{}{
    "A1": "B1",
    "C1": map[string]string{
        "D1": "E1",
        "F1": "G1",
    },
    "I1": "J1",
}

Your Go function should parse this string into the above map, then update the value of the nested key F1 from G1 to some other value, say 'NewValue'. The function should ultimately return the updated map.

Step 1 - Setting Up the Function and Variables

First, set up the function and necessary variables:

package main

import (
    "fmt"
    "strings"
)

func parseString(inputString string) map[string]interface{} {
    resultMap := make(map[string]interface{})

    var key string
    innerMap := make(map[string]string)
    inInnerMap := false
    i := 0

Step 2 - Handling the Opening and Closing Braces

Next, handle the opening and closing braces. If an inner map is encountered, set the flag and prepare to parse it:

    for i < len(inputString) {
        switch inputString[i] {
        case '{':
            inInnerMap = true
            i++ // Skip the '{'
        case '}':
            resultMap[key] = innerMap
            innerMap = make(map[string]string)
            inInnerMap = false
            i++ // Skip the '}'
            if i < len(inputString) && inputString[i] == ',' {
                i++ // Skip the ',' after '}'
            }

Step 3 - Parsing Outer Map Key-Value Pairs

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal