github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/passes/unusedwrite/testdata/src/a/unusedwrite.go (about)

     1  package a
     2  
     3  type T1 struct{ x int }
     4  
     5  type T2 struct {
     6  	x int
     7  	y int
     8  }
     9  
    10  type T3 struct{ y *T1 }
    11  
    12  func BadWrites() {
    13  	// Test struct field writes.
    14  	var s1 T1
    15  	s1.x = 10 // want "unused write to field x"
    16  
    17  	// Test array writes.
    18  	var s2 [10]int
    19  	s2[1] = 10 // want "unused write to array index 1:int"
    20  
    21  	// Test range variables of struct type.
    22  	s3 := []T1{T1{x: 100}}
    23  	for i, v := range s3 {
    24  		v.x = i // want "unused write to field x"
    25  	}
    26  
    27  	// Test the case where a different field is read after the write.
    28  	s4 := []T2{T2{x: 1, y: 2}}
    29  	for i, v := range s4 {
    30  		v.x = i // want "unused write to field x"
    31  		_ = v.y
    32  	}
    33  }
    34  
    35  func (t T1) BadValueReceiverWrite(v T2) {
    36  	t.x = 10 // want "unused write to field x"
    37  	v.y = 20 // want "unused write to field y"
    38  }
    39  
    40  func GoodWrites(m map[int]int) {
    41  	// A map is copied by reference such that a write will affect the original map.
    42  	m[1] = 10
    43  
    44  	// Test struct field writes.
    45  	var s1 T1
    46  	s1.x = 10
    47  	print(s1.x)
    48  
    49  	// Test array writes.
    50  	var s2 [10]int
    51  	s2[1] = 10
    52  	// Current the checker doesn't distinguish index 1 and index 2.
    53  	_ = s2[2]
    54  
    55  	// Test range variables of struct type.
    56  	s3 := []T1{T1{x: 100}}
    57  	for i, v := range s3 { // v is a copy
    58  		v.x = i
    59  		_ = v.x // still a usage
    60  	}
    61  
    62  	// Test an object with multiple fields.
    63  	o := &T2{x: 10, y: 20}
    64  	print(o)
    65  
    66  	// Test an object of embedded struct/pointer type.
    67  	t1 := &T1{x: 10}
    68  	t2 := &T3{y: t1}
    69  	print(t2)
    70  }
    71  
    72  func (t *T1) GoodPointerReceiverWrite(v *T2) {
    73  	t.x = 10
    74  	v.y = 20
    75  }