@@ -594,48 +594,96 @@ var (
594
594
)
595
595
596
596
func createInsertComponent (keys []string , setValue []byte , comma , object bool ) []byte {
597
- var buffer bytes.Buffer
598
597
isIndex := string (keys [0 ][0 ]) == "["
598
+ offset := 0
599
+ lk := calcAllocateSpace (keys , setValue , comma , object )
600
+ buffer := make ([]byte , lk , lk )
599
601
if comma {
600
- buffer . WriteString ( "," )
602
+ offset += WriteToBuffer ( buffer [ offset :], "," )
601
603
}
602
604
if isIndex && ! comma {
603
- buffer . WriteString ( "[" )
605
+ offset += WriteToBuffer ( buffer [ offset :], "[" )
604
606
} else {
605
607
if object {
606
- buffer . WriteString ( "{" )
608
+ offset += WriteToBuffer ( buffer [ offset :], "{" )
607
609
}
608
610
if ! isIndex {
609
- buffer . WriteString ( "\" " )
610
- buffer . WriteString ( keys [0 ])
611
- buffer . WriteString ( "\" :" )
611
+ offset += WriteToBuffer ( buffer [ offset :], "\" " )
612
+ offset += WriteToBuffer ( buffer [ offset :], keys [0 ])
613
+ offset += WriteToBuffer ( buffer [ offset :], "\" :" )
612
614
}
613
615
}
614
616
615
617
for i := 1 ; i < len (keys ); i ++ {
616
618
if string (keys [i ][0 ]) == "[" {
617
- buffer . WriteString ( "[" )
619
+ offset += WriteToBuffer ( buffer [ offset :], "[" )
618
620
} else {
619
- buffer . WriteString ( "{\" " )
620
- buffer . WriteString ( keys [i ])
621
- buffer . WriteString ( "\" :" )
621
+ offset += WriteToBuffer ( buffer [ offset :], "{\" " )
622
+ offset += WriteToBuffer ( buffer [ offset :], keys [i ])
623
+ offset += WriteToBuffer ( buffer [ offset :], "\" :" )
622
624
}
623
625
}
624
- buffer . Write (setValue )
626
+ offset += WriteToBuffer ( buffer [ offset :], string (setValue ) )
625
627
for i := len (keys ) - 1 ; i > 0 ; i -- {
626
628
if string (keys [i ][0 ]) == "[" {
627
- buffer . WriteString ( "]" )
629
+ offset += WriteToBuffer ( buffer [ offset :], "]" )
628
630
} else {
629
- buffer . WriteString ( "}" )
631
+ offset += WriteToBuffer ( buffer [ offset :], "}" )
630
632
}
631
633
}
632
634
if isIndex && ! comma {
633
- buffer .WriteString ("]" )
635
+ offset += WriteToBuffer (buffer [offset :], "]" )
636
+ }
637
+ if object && ! isIndex {
638
+ offset += WriteToBuffer (buffer [offset :], "}" )
639
+ }
640
+ return buffer
641
+ }
642
+
643
+ func calcAllocateSpace (keys []string , setValue []byte , comma , object bool ) int {
644
+ isIndex := string (keys [0 ][0 ]) == "["
645
+ lk := 0
646
+ if comma {
647
+ // ,
648
+ lk += 1
649
+ }
650
+ if isIndex && ! comma {
651
+ // []
652
+ lk += 2
653
+ } else {
654
+ if object {
655
+ // {
656
+ lk += 1
657
+ }
658
+ if ! isIndex {
659
+ // "keys[0]"
660
+ lk += len (keys [0 ]) + 3
661
+ }
634
662
}
663
+
664
+
665
+ lk += len (setValue )
666
+ for i := 1 ; i < len (keys ); i ++ {
667
+ if string (keys [i ][0 ]) == "[" {
668
+ // []
669
+ lk += 2
670
+ } else {
671
+ // {"keys[i]":setValue}
672
+ lk += len (keys [i ]) + 5
673
+ }
674
+ }
675
+
635
676
if object && ! isIndex {
636
- buffer .WriteString ("}" )
677
+ // }
678
+ lk += 1
637
679
}
638
- return buffer .Bytes ()
680
+
681
+ return lk
682
+ }
683
+
684
+ func WriteToBuffer (buffer []byte , str string ) int {
685
+ copy (buffer , str )
686
+ return len (str )
639
687
}
640
688
641
689
/*
0 commit comments