code: func readKeyList(r *bufio.Reader) (key string, msg []string, err error) {
  	key, err = readString1(r)
  	if err != nil {
  		return
  	}
  	msg = []string{}
  	for {
  		var c byte
  		c, err = r.ReadByte()
  		if err != nil {
  			return
  		}
  		switch elementType(c) {
  		case etLIST_ITEM:
  			value, err := readString2(r)
  			if err != nil {
  				return "", nil, err
  			}
  			msg = append(msg, value)
  		case etLIST_END: //end of outer list
  			return key, msg, nil
  		default:
  			return "", nil, fmt.Errorf("[readKeyList] protocol error 2")
  		}
  	}
  	return
  }
docs: //LIST_START has been read already.