feat(reflect): add Indirect function

Implements reflect.Indirect function to support pointer dereferencing.
This function returns the value that a pointer points to, or returns
the value unchanged if it's not a pointer.

Fixes #1354

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: luoliwoshang <luoliwoshang@users.noreply.github.com>
This commit is contained in:
xgopilot
2025-10-17 08:06:30 +00:00
parent d2a22252c2
commit e47728b053
2 changed files with 34 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
package main
import (
"fmt"
"reflect"
)
func main() {
x := 42
p := &x
// Test 1: Non-pointer value - should return same value
v1 := reflect.Indirect(reflect.ValueOf(x))
fmt.Printf("Non-pointer: %v\n", v1.Interface())
// Test 2: Pointer - should dereference
v2 := reflect.Indirect(reflect.ValueOf(p))
fmt.Printf("Pointer: %v\n", v2.Interface())
// Test 3: Nil pointer
var nilPtr *int
v3 := reflect.Indirect(reflect.ValueOf(nilPtr))
fmt.Printf("Nil pointer valid: %v\n", v3.IsValid())
}

View File

@@ -1759,6 +1759,16 @@ func ValueOf(i any) Value {
return unpackEface(i) return unpackEface(i)
} }
// Indirect returns the value that v points to.
// If v is a nil pointer, Indirect returns a zero Value.
// If v is not a pointer, Indirect returns v.
func Indirect(v Value) Value {
if v.Kind() != Pointer {
return v
}
return v.Elem()
}
// arrayAt returns the i-th element of p, // arrayAt returns the i-th element of p,
// an array whose elements are eltSize bytes wide. // an array whose elements are eltSize bytes wide.
// The array pointed at by p must have at least i+1 elements: // The array pointed at by p must have at least i+1 elements: