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

     1  // Copyright 2018, 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 value
     8  
     9  import (
    10  	"reflect"
    11  	"unsafe"
    12  )
    13  
    14  // Pointer is an opaque typed pointer and is guaranteed to be comparable.
    15  type Pointer struct {
    16  	p unsafe.Pointer
    17  	t reflect.Type
    18  }
    19  
    20  // PointerOf returns a Pointer from v, which must be a
    21  // reflect.Ptr, reflect.Slice, or reflect.Map.
    22  func PointerOf(v reflect.Value) Pointer {
    23  	// The proper representation of a pointer is unsafe.Pointer,
    24  	// which is necessary if the GC ever uses a moving collector.
    25  	return Pointer{unsafe.Pointer(v.Pointer()), v.Type()}
    26  }