| package a |
| |
| type T1 struct{ x int } |
| |
| type T2 struct { |
| x int |
| y int |
| } |
| |
| type T3 struct{ y *T1 } |
| |
| func BadWrites() { |
| // Test struct field writes. |
| var s1 T1 |
| s1.x = 10 // want "unused write to field x" |
| |
| // Test array writes. |
| var s2 [10]int |
| s2[1] = 10 // want "unused write to array index 1:int" |
| |
| // Test range variables of struct type. |
| s3 := []T1{T1{x: 100}} |
| for i, v := range s3 { |
| v.x = i // want "unused write to field x" |
| } |
| |
| // Test the case where a different field is read after the write. |
| s4 := []T2{T2{x: 1, y: 2}} |
| for i, v := range s4 { |
| v.x = i // want "unused write to field x" |
| _ = v.y |
| } |
| } |
| |
| func (t T1) BadValueReceiverWrite(v T2) { |
| t.x = 10 // want "unused write to field x" |
| v.y = 20 // want "unused write to field y" |
| } |
| |
| func GoodWrites(m map[int]int) { |
| // A map is copied by reference such that a write will affect the original map. |
| m[1] = 10 |
| |
| // Test struct field writes. |
| var s1 T1 |
| s1.x = 10 |
| print(s1.x) |
| |
| // Test array writes. |
| var s2 [10]int |
| s2[1] = 10 |
| // Current the checker doesn't distinguish index 1 and index 2. |
| _ = s2[2] |
| |
| // Test range variables of struct type. |
| s3 := []T1{T1{x: 100}} |
| for i, v := range s3 { // v is a copy |
| v.x = i |
| _ = v.x // still a usage |
| } |
| |
| // Test an object with multiple fields. |
| o := &T2{x: 10, y: 20} |
| print(o) |
| |
| // Test an object of embedded struct/pointer type. |
| t1 := &T1{x: 10} |
| t2 := &T3{y: t1} |
| print(t2) |
| } |
| |
| func (t *T1) GoodPointerReceiverWrite(v *T2) { |
| t.x = 10 |
| v.y = 20 |
| } |