diff --git a/message.go b/message.go
index 4036ad9..302fe6a 100644
--- a/message.go
+++ b/message.go
@@ -1,4 +1,3 @@
-// message.go
 package swservice
 
 import (
@@ -9,6 +8,7 @@
 	"strconv"
 )
 
+// MessageWriter writer
 type MessageWriter struct {
 	FuncNo      int `json:"funcno"`
 	Attributes  map[string]interface{}
@@ -18,6 +18,7 @@
 	Row         map[string]interface{}
 }
 
+// NewMessageReader reader
 func NewMessageWriter(funcno int) *MessageWriter {
 	return &MessageWriter{
 		FuncNo:      funcno,
@@ -26,9 +27,13 @@
 		ColumnDescs: make([]string, 0),
 		RowData:     make([]map[string]interface{}, 0)}
 }
+
+// SetAttr  set attribute
 func (m *MessageWriter) SetAttr(name string, value interface{}) {
 	m.Attributes[name] = value
 }
+
+// AddCol  add column data
 func (m *MessageWriter) AddCol(name string, value interface{}) {
 	if m.Row == nil {
 		m.Row = make(map[string]interface{})
@@ -36,7 +41,7 @@
 	m.Row[name] = value
 }
 
-func is_contains(k string, slice []string) bool {
+func isContains(k string, slice []string) bool {
 	for _, v := range slice {
 		if k == v {
 			return true
@@ -45,6 +50,7 @@
 	return false
 }
 
+// AddRow add row
 func (m *MessageWriter) AddRow() {
 	if m.Row == nil {
 		return
@@ -75,11 +81,11 @@
 	m.Row = nil
 }
 
-func (m *MessageWriter) serialize_rowdata() {
+func (m *MessageWriter) serializeRowData() {
 	m.ColumnNames = make([]string, 0)
 	for _, row := range m.RowData {
 		for k, _ := range row {
-			if !is_contains(k, m.ColumnNames) {
+			if !isContains(k, m.ColumnNames) {
 				m.ColumnNames = append(m.ColumnNames, k)
 			}
 		}
@@ -100,9 +106,10 @@
 	m.Attributes["rowcnt"] = len(rows)
 }
 
+// Serialize 序列化
 func (m *MessageWriter) Serialize() string {
 	m.Attributes["funcno"] = m.FuncNo
-	m.serialize_rowdata()
+	m.serializeRowData()
 	m.Attributes["colname"] = m.ColumnNames
 	m.Attributes["coldesc"] = m.ColumnNames
 	m.Attributes["colcnt"] = len(m.ColumnNames)
@@ -111,6 +118,8 @@
 }
 
 //////////////////////////////////////////////////////////////////////
+
+// MessageReader message reader
 type MessageReader struct {
 	FuncNo      int
 	RetCode     int
@@ -124,7 +133,7 @@
 	RowIndex    int
 }
 
-func get_value_as_int(value interface{}) int {
+func getValueAsInt(value interface{}) int {
 	//	vtype := reflect.TypeOf(value)
 	switch value.(type) {
 	case int:
@@ -139,7 +148,7 @@
 	}
 }
 
-func get_column_names(data interface{}) (result []string) {
+func getColumnNames(data interface{}) (result []string) {
 	if data == nil {
 		return nil
 	}
@@ -151,7 +160,7 @@
 	return
 }
 
-func convert_to_int(value interface{}) int {
+func convertToInt(value interface{}) int {
 	if value == nil {
 		return 0
 	}
@@ -168,13 +177,14 @@
 	}
 }
 
-func convert_to_string(value interface{}) string {
+func convertToString(value interface{}) string {
 	if value == nil {
 		return ""
 	}
 	return fmt.Sprintf("%v", value)
 }
 
+// NewMessageReader new MessageReader
 func NewMessageReader(data []byte) *MessageReader {
 	var s interface{}
 	err := json.Unmarshal(data, &s)
@@ -185,14 +195,14 @@
 
 	m := &MessageReader{Attributes: make(map[string]interface{}),
 		RowData: make([]map[string]interface{}, 0)}
-	m.FuncNo = convert_to_int(obj["funcno"])
-	m.RetCode = convert_to_int(obj["retcode"])
-	m.RetMsg = convert_to_string(obj["retmsg"])
-	m.DBMsg = convert_to_string(obj["dbmsg"])
-	m.ErrName = convert_to_string(obj["errname"])
+	m.FuncNo = convertToInt(obj["funcno"])
+	m.RetCode = convertToInt(obj["retcode"])
+	m.RetMsg = convertToString(obj["retmsg"])
+	m.DBMsg = convertToString(obj["dbmsg"])
+	m.ErrName = convertToString(obj["errname"])
 
-	m.ColumnNames = get_column_names(obj["colname"])
-	m.ColumnDescs = get_column_names(obj["coldesc"])
+	m.ColumnNames = getColumnNames(obj["colname"])
+	m.ColumnDescs = getColumnNames(obj["coldesc"])
 
 	if rowdata, err := obj["rowdata"]; err {
 		if rowdata != nil {
@@ -227,14 +237,17 @@
 	return m
 }
 
+// RowCount row count
 func (m *MessageReader) RowCount() int {
 	return len(m.RowData)
 }
 
+// HasMore has more row
 func (m *MessageReader) HasMore() bool {
 	return m.RowIndex < m.RowCount()
 }
 
+// NextRow next row
 func (m *MessageReader) NextRow() error {
 	m.RowIndex++
 	if m.RowIndex > m.RowCount() {
@@ -243,15 +256,17 @@
 	return nil
 }
 
+// GetCol get column
 func (m *MessageReader) GetCol(name string) interface{} {
 	idx := m.RowIndex - 1
-	if v, ok := m.RowData[idx][name]; !ok {
+	v, ok := m.RowData[idx][name]
+	if !ok {
 		return nil
-	} else {
-		return v
 	}
+	return v
 }
 
+// GetColAsInt  get column data as int
 func (m *MessageReader) GetColAsInt(name string) int {
 	v := m.GetCol(name)
 	switch v.(type) {
@@ -269,11 +284,13 @@
 	}
 }
 
+// GetColAsString get column data as string
 func (m *MessageReader) GetColAsString(name string) string {
 	v := m.GetCol(name)
 	return fmt.Sprintf("%v", v)
 }
 
+// GetColAsDouble get column data as double
 func (m *MessageReader) GetColAsDouble(name string) float64 {
 	v := m.GetCol(name)
 	switch v.(type) {
@@ -291,10 +308,11 @@
 	}
 }
 
+// GetAttr get attribute value
 func (m *MessageReader) GetAttr(name string) interface{} {
-	if v, ok := m.Attributes[name]; !ok {
+	v, ok := m.Attributes[name]
+	if !ok {
 		return nil
-	} else {
-		return v
 	}
+	return v
 }
