improvement: optimization of readmap function

Signed-off-by: thomas-dg <dyhshome@126.com>
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index eada449..fad5620 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -33,6 +33,10 @@
 * Fixed so that TrimGlobalStep and TrimLocalStep have the same character control handling as Ltrim and Rtrim
 * Fix a bug in MaxLocalStep, MinLocalStep, MeanLocalStep and SumLocalStep that it throws NoSuchElementException when encounters an empty iterator as input.
 
+==== Improvements
+
+* TINKERPOP-3093 optimization of readmap function
+
 [[release-3-7-2]]
 === TinkerPop 3.7.2 (April 8, 2024)
 
diff --git a/gremlin-go/driver/graphBinary.go b/gremlin-go/driver/graphBinary.go
index f9eb548..7c95b01 100644
--- a/gremlin-go/driver/graphBinary.go
+++ b/gremlin-go/driver/graphBinary.go
@@ -989,14 +989,14 @@
 		}
 		if k == nil {
 			mapData[nil] = v
+		} else if reflect.TypeOf(k).Comparable() {
+			mapData[k] = v
 		} else {
 			switch reflect.TypeOf(k).Kind() {
 			case reflect.Map:
 				mapData[&k] = v
-			case reflect.Slice:
-				mapData[fmt.Sprint(k)] = v
 			default:
-				mapData[k] = v
+				mapData[fmt.Sprint(k)] = v
 			}
 		}
 	}
diff --git a/gremlin-go/driver/graphBinary_test.go b/gremlin-go/driver/graphBinary_test.go
index 5bfcf68..eda45d6 100644
--- a/gremlin-go/driver/graphBinary_test.go
+++ b/gremlin-go/driver/graphBinary_test.go
@@ -232,6 +232,76 @@
 			assert.Nil(t, err)
 			assert.Equal(t, fmt.Sprintf("%v", source), fmt.Sprintf("%v", res))
 		})
+		t.Run("read incomparable map: a map value as the key", func(t *testing.T) {
+			// prepare test data
+			var buf = &bytes.Buffer{}
+			typeSerializer := &graphBinaryTypeSerializer{}
+			// write the size of map
+			err := binary.Write(buf, binary.BigEndian, uint32(1))
+			if err != nil {
+				t.Fatalf("Failed to write data: %v", err)
+			}
+			// write a map value as the key
+			k1 := map[string]string{"key": "value"}
+			_, err = typeSerializer.write(reflect.ValueOf(k1).Interface(), buf)
+			if err != nil {
+				t.Fatalf("Failed to encode data: %v", err)
+			}
+			v1 := "value1"
+			_, err = typeSerializer.write(reflect.ValueOf(v1).Interface(), buf)
+			if err != nil {
+				t.Fatalf("Failed to encode data: %v", err)
+			}
+
+			data := buf.Bytes()
+			i := 0
+			result, err := readMap(&data, &i)
+			if err != nil {
+				t.Fatalf("readMap failed: %v", err)
+			}
+			mResult, ok := result.(map[interface{}]interface{})
+			if !ok {
+				t.Fatalf("readMap result not map[interface{}]interface{}")
+			}
+			for k, v := range mResult {
+				assert.Equal(t, reflect.Ptr, reflect.TypeOf(k).Kind())
+				assert.Equal(t, "value1", v)
+			}
+		})
+		t.Run("read incomparable map: a slice value as the key", func(t *testing.T) {
+			// prepare test data
+			var buf = &bytes.Buffer{}
+			typeSerializer := &graphBinaryTypeSerializer{}
+			// write the size of map
+			err := binary.Write(buf, binary.BigEndian, uint32(1))
+			if err != nil {
+				t.Fatalf("Failed to write data: %v", err)
+			}
+			// write a slice value as the key
+			k2 := []int{1, 2, 3}
+			_, err = typeSerializer.write(reflect.ValueOf(k2).Interface(), buf)
+			if err != nil {
+				t.Fatalf("Failed to encode data: %v", err)
+			}
+			v2 := "value2"
+			_, err = typeSerializer.write(reflect.ValueOf(v2).Interface(), buf)
+			if err != nil {
+				t.Fatalf("Failed to encode data: %v", err)
+			}
+
+			data := buf.Bytes()
+			i := 0
+			result, err := readMap(&data, &i)
+			if err != nil {
+				t.Fatalf("readMap failed: %v", err)
+			}
+			expected := map[interface{}]interface{}{
+				"[1 2 3]": "value2",
+			}
+			if !reflect.DeepEqual(result, expected) {
+				t.Errorf("Expected %v, but got %v", expected, result)
+			}
+		})
 		t.Run("read-write time", func(t *testing.T) {
 			pos := 0
 			var buffer bytes.Buffer