github.com/integration-system/go-cmp@v0.0.0-20190131081942-ac5582987a2f/cmp/unsafe_reflect.go (about)

     1  // Copyright 2017, The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE.md file.
     4  
     5  // +build !purego
     6  
     7  package cmp
     8  
     9  import (
    10  	"reflect"
    11  	"unsafe"
    12  )
    13  
    14  const supportAllowUnexported = true
    15  
    16  // unsafeRetrieveField uses unsafe to forcibly retrieve any field from a struct
    17  // such that the value has read-write permissions.
    18  //
    19  // The parent struct, v, must be addressable, while f must be a StructField
    20  // describing the field to retrieve.
    21  func unsafeRetrieveField(v reflect.Value, f reflect.StructField) reflect.Value {
    22  	return reflect.NewAt(f.Type, unsafe.Pointer(v.UnsafeAddr()+f.Offset)).Elem()
    23  }