dp
\n# Code\n\nfunc splitMessage(message string, limit int) []string {\n    idxLen := 0\n    ok := false\n    for i:= 1; i <= len(message); i ++{\n        idxLen, 
\n# Code\n```\nfunc splitMessage(message string, limit int) []string {\n    idxLen := 0\n    ok := false\n    for i:= 1; i <= len(message); i ++{\n        idxLen, ok = find(message, limit, i, idxLen)\n        if ok {\n            return build(message, limit, i)\n        }\n    }\n    return nil\n}\n\nfunc build(message string, limit, parts int) []string{\n    ret := []string{}\n    for i := 1 ; i <= parts; i ++{\n        suffix := fmt.Sprintf("<%v/%v>", i, parts)\n        prefixLen := limit - len(suffix)\n        if prefixLen > len(message) {\n            prefixLen = len(message)\n        }\n        w := message[:prefixLen] + suffix\n        ret = append(ret, w)\n        message = message[prefixLen:]\n    }\n    return ret\n}\n\nfunc find (message string, limit, parts, idxLen int) (int, bool){\n    idxLen += nl(parts) // for the new added <14/14>\n    if len(message) + idxLen + (nl(parts) + len("</>")) * parts <= limit * parts{\n        return idxLen, true\n    }\n    return idxLen, false\n}\n\nfunc nl (n int) int{\n    return len(strconv.Itoa(n))\n}\n```
['Go']