@@ -114,6 +114,24 @@ func TestMapOperatorAssignment(t *testing.T) {
114114 }
115115}
116116
117+ var sinkAppend bool
118+
119+ func TestMapAppendAssignment (t * testing.T ) {
120+ m := make (map [int ][]int , 0 )
121+
122+ m [0 ] = nil
123+ m [0 ] = append (m [0 ], 12345 )
124+ m [0 ] = append (m [0 ], 67890 )
125+ sinkAppend , m [0 ] = ! sinkAppend , append (m [0 ], 123 , 456 )
126+ a := []int {7 , 8 , 9 , 0 }
127+ m [0 ] = append (m [0 ], a ... )
128+
129+ want := []int {12345 , 67890 , 123 , 456 , 7 , 8 , 9 , 0 }
130+ if got := m [0 ]; ! reflect .DeepEqual (got , want ) {
131+ t .Errorf ("got %v, want %v" , got , want )
132+ }
133+ }
134+
117135// Maps aren't actually copied on assignment.
118136func TestAlias (t * testing.T ) {
119137 m := make (map [int ]int , 0 )
@@ -839,6 +857,16 @@ func benchmarkMapOperatorAssignInt32(b *testing.B, n int) {
839857 }
840858}
841859
860+ func benchmarkMapAppendAssignInt32 (b * testing.B , n int ) {
861+ a := make (map [int32 ][]int )
862+ b .ReportAllocs ()
863+ b .ResetTimer ()
864+ for i := 0 ; i < b .N ; i ++ {
865+ key := int32 (i & (n - 1 ))
866+ a [key ] = append (a [key ], i )
867+ }
868+ }
869+
842870func benchmarkMapDeleteInt32 (b * testing.B , n int ) {
843871 a := make (map [int32 ]int , n )
844872 b .ResetTimer ()
@@ -868,6 +896,16 @@ func benchmarkMapOperatorAssignInt64(b *testing.B, n int) {
868896 }
869897}
870898
899+ func benchmarkMapAppendAssignInt64 (b * testing.B , n int ) {
900+ a := make (map [int64 ][]int )
901+ b .ReportAllocs ()
902+ b .ResetTimer ()
903+ for i := 0 ; i < b .N ; i ++ {
904+ key := int64 (i & (n - 1 ))
905+ a [key ] = append (a [key ], i )
906+ }
907+ }
908+
871909func benchmarkMapDeleteInt64 (b * testing.B , n int ) {
872910 a := make (map [int64 ]int , n )
873911 b .ResetTimer ()
@@ -908,6 +946,20 @@ func benchmarkMapOperatorAssignStr(b *testing.B, n int) {
908946 }
909947}
910948
949+ func benchmarkMapAppendAssignStr (b * testing.B , n int ) {
950+ k := make ([]string , n )
951+ for i := 0 ; i < len (k ); i ++ {
952+ k [i ] = strconv .Itoa (i )
953+ }
954+ a := make (map [string ][]string )
955+ b .ReportAllocs ()
956+ b .ResetTimer ()
957+ for i := 0 ; i < b .N ; i ++ {
958+ key := k [i & (n - 1 )]
959+ a [key ] = append (a [key ], key )
960+ }
961+ }
962+
911963func benchmarkMapDeleteStr (b * testing.B , n int ) {
912964 i2s := make ([]string , n )
913965 for i := 0 ; i < n ; i ++ {
@@ -949,6 +1001,12 @@ func BenchmarkMapOperatorAssign(b *testing.B) {
9491001 b .Run ("Str" , runWith (benchmarkMapOperatorAssignStr , 1 << 8 , 1 << 16 ))
9501002}
9511003
1004+ func BenchmarkMapAppendAssign (b * testing.B ) {
1005+ b .Run ("Int32" , runWith (benchmarkMapAppendAssignInt32 , 1 << 8 , 1 << 16 ))
1006+ b .Run ("Int64" , runWith (benchmarkMapAppendAssignInt64 , 1 << 8 , 1 << 16 ))
1007+ b .Run ("Str" , runWith (benchmarkMapAppendAssignStr , 1 << 8 , 1 << 16 ))
1008+ }
1009+
9521010func BenchmarkMapDelete (b * testing.B ) {
9531011 b .Run ("Int32" , runWith (benchmarkMapDeleteInt32 , 100 , 1000 , 10000 ))
9541012 b .Run ("Int64" , runWith (benchmarkMapDeleteInt64 , 100 , 1000 , 10000 ))
0 commit comments