# The Laws of Reflection
6 Sep 2011
Tags: interface, reflect, type, technical
Summary: Reflection in computing is the ability of a program to examine its own structure, particularly through types; it's a form of metaprogramming. It's also a great source of confusion.

Rob Pike

## Introduction

Reflection in computing is the ability of a program to examine its own structure,
particularly through types;
it's a form of metaprogramming.
It's also a great source of confusion.

In this article we attempt to clarify things by explaining how reflection works in Go.
Each language's reflection model is different (and many languages don't support it at all),
but this article is about Go, so for the rest of this article the word "reflection"
should be taken to mean "reflection in Go".

## Types and interfaces

Because reflection builds on the type system, let's start with a refresher about types in Go.

Go is statically typed. Every variable has a static type,
that is, exactly one type known and fixed at compile time:
`int`, `float32`, `*MyType`, `[]byte`, and so on. If we declare

	type MyInt int

	var i int
	var j MyInt

then `i` has type `int` and `j` has type `MyInt`.
The variables `i` and `j` have distinct static types and,
although they have the same underlying type,
they cannot be assigned to one another without a conversion.

One important category of type is interface types,
which represent fixed sets of methods.
An interface variable can store any concrete (non-interface) value as long
as that value implements the interface's methods.
A well-known pair of examples is `io.Reader` and `io.Writer`,
the types `Reader` and `Writer` from the [io package](https://golang.org/pkg/io/):

	// Reader is the interface that wraps the basic Read method.
	type Reader interface {
	    Read(p []byte) (n int, err error)
	}

	// Writer is the interface that wraps the basic Write method.
	type Writer interface {
	    Write(p []byte) (n int, err error)
	}

Any type that implements a `Read` (or `Write`) method with this signature
is said to implement `io.Reader` (or `io.Writer`).
For the purposes of this discussion, that means that a variable of type
`io.Reader` can hold any value whose type has a `Read` method:

	var r io.Reader
	r = os.Stdin
	r = bufio.NewReader(r)
	r = new(bytes.Buffer)
	// and so on

It's important to be clear that whatever concrete value `r` may hold,
`r`'s type is always `io.Reader`:
Go is statically typed and the static type of `r` is `io.Reader`.

An extremely important example of an interface type is the empty interface:

	interface{}

It represents the empty set of methods and is satisfied by any value at all, since any value has zero or more methods.

Some people say that Go's interfaces are dynamically typed,
but that is misleading.
They are statically typed: a variable of interface type always has the same static type,
and even though at run time the value stored in the interface variable may change type,
that value will always satisfy the interface.

We need to be precise about all this because reflection and interfaces are closely related.

## The representation of an interface

Russ Cox has written a [ detailed blog post](https://research.swtch.com/2009/12/go-data-structures-interfaces.html)
about the representation of interface values in Go.
It's not necessary to repeat the full story here,
but a simplified summary is in order.

A variable of interface type stores a pair:
the concrete value assigned to the variable,
and that value's type descriptor.
To be more precise, the value is the underlying concrete data item that
implements the interface and the type describes the full type of that item. For instance, after

	var r io.Reader
	tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
	if err != nil {
	    return nil, err
	}
	r = tty

`r` contains, schematically, the (value, type) pair,
(`tty`, `*os.File`).
Notice that the type `*os.File` implements methods other than `Read`;
even though the interface value provides access only to the `Read` method,
the value inside carries all the type information about that value.
That's why we can do things like this:

	var w io.Writer
	w = r.(io.Writer)

The expression in this assignment is a type assertion;
what it asserts is that the item inside `r` also implements `io.Writer`,
and so we can assign it to `w`.
After the assignment, `w` will contain the pair (`tty`, `*os.File`).
That's the same pair as was held in `r`. The static type of the interface
determines what methods may be invoked with an interface variable,
even though the concrete value inside may have a larger set of methods.

Continuing, we can do this:

	var empty interface{}
	empty = w

and our empty interface value `empty` will again contain that same pair,
(`tty`, `*os.File`).
That's handy: an empty interface can hold any value and contains all the
information we could ever need about that value.

(We don't need a type assertion here because it's known statically that
`w` satisfies the empty interface.
In the example where we moved a value from a `Reader` to a `Writer`,
we needed to be explicit and use a type assertion because `Writer`'s methods
are not a subset of `Reader`'s.)

One important detail is that the pair inside an interface always has the form (value,
concrete type) and cannot have the form (value, interface type).
Interfaces do not hold interface values.

Now we're ready to reflect.

## The first law of reflection

## 1. Reflection goes from interface value to reflection object.

At the basic level, reflection is just a mechanism to examine the type and
value pair stored inside an interface variable.
To get started, there are two types we need to know about in [package reflect](https://golang.org/pkg/reflect/):
[Type](https://golang.org/pkg/reflect/#Type) and [Value](https://golang.org/pkg/reflect/#Value).
Those two types give access to the contents of an interface variable,
and two simple functions, called `reflect.TypeOf` and `reflect.ValueOf`,
retrieve `reflect.Type` and `reflect.Value` pieces out of an interface value.
(Also, from the `reflect.Value` it's easy to get to the `reflect.Type`,
but let's keep the `Value` and `Type` concepts separate for now.)

Let's start with `TypeOf`:

	package main

	import (
	    "fmt"
	    "reflect"
	)

	func main() {
	    var x float64 = 3.4
	    fmt.Println("type:", reflect.TypeOf(x))
	}

This program prints

	type: float64

You might be wondering where the interface is here,
since the program looks like it's passing the `float64` variable `x`,
not an interface value, to `reflect.TypeOf`.
But it's there; as [godoc reports](https://golang.org/pkg/reflect/#TypeOf),
the signature of `reflect.TypeOf` includes an empty interface:

	// TypeOf returns the reflection Type of the value in the interface{}.
	func TypeOf(i interface{}) Type

When we call `reflect.TypeOf(x)`, `x` is first stored in an empty interface,
which is then passed as the argument;
`reflect.TypeOf` unpacks that empty interface to recover the type information.

The `reflect.ValueOf` function, of course,
recovers the value (from here on we'll elide the boilerplate and focus just
on the executable code):

	var x float64 = 3.4
	fmt.Println("value:", reflect.ValueOf(x).String())

prints

	value: <float64 Value>

(We call the `String` method explicitly because by default the `fmt` package
digs into a `reflect.Value` to show the concrete value inside.
The `String` method does not.)

Both `reflect.Type` and `reflect.Value` have lots of methods to let us examine
and manipulate them.
One important example is that `Value` has a `Type` method that returns the
`Type` of a `reflect.Value`.
Another is that both `Type` and `Value` have a `Kind` method that returns
a constant indicating what sort of item is stored:
`Uint`, `Float64`, `Slice`, and so on.
Also methods on `Value` with names like `Int` and `Float` let us grab values
(as `int64` and `float64`) stored inside:

	var x float64 = 3.4
	v := reflect.ValueOf(x)
	fmt.Println("type:", v.Type())
	fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
	fmt.Println("value:", v.Float())

prints

	type: float64
	kind is float64: true
	value: 3.4

There are also methods like `SetInt` and `SetFloat` but to use them we need
to understand settability,
the subject of the third law of reflection, discussed below.

The reflection library has a couple of properties worth singling out.
First, to keep the API simple, the "getter" and "setter" methods of `Value`
operate on the largest type that can hold the value:
`int64` for all the signed integers, for instance.
That is, the `Int` method of `Value` returns an `int64` and the `SetInt`
value takes an `int64`;
it may be necessary to convert to the actual type involved:

	var x uint8 = 'x'
	v := reflect.ValueOf(x)
	fmt.Println("type:", v.Type())                            // uint8.
	fmt.Println("kind is uint8: ", v.Kind() == reflect.Uint8) // true.
	x = uint8(v.Uint())                                       // v.Uint returns a uint64.

The second property is that the `Kind` of a reflection object describes
the underlying type,
not the static type.
If a reflection object contains a value of a user-defined integer type, as in

	type MyInt int
	var x MyInt = 7
	v := reflect.ValueOf(x)

the `Kind` of `v` is still `reflect.Int`,
even though the static type of `x` is `MyInt`, not `int`.
In other words, the `Kind` cannot discriminate an int from a `MyInt` even
though the `Type` can.

## The second law of reflection

## 2. Reflection goes from reflection object to interface value.

Like physical reflection, reflection in Go generates its own inverse.

Given a `reflect.Value` we can recover an interface value using the `Interface` method;
in effect the method packs the type and value information back into an interface
representation and returns the result:

	// Interface returns v's value as an interface{}.
	func (v Value) Interface() interface{}

As a consequence we can say

	y := v.Interface().(float64) // y will have type float64.
	fmt.Println(y)

to print the `float64` value represented by the reflection object `v`.

We can do even better, though. The arguments to `fmt.Println`,
`fmt.Printf` and so on are all passed as empty interface values,
which are then unpacked by the `fmt` package internally just as we have
been doing in the previous examples.
Therefore all it takes to print the contents of a `reflect.Value` correctly
is to pass the result of the `Interface` method to the formatted print routine:

	fmt.Println(v.Interface())

(Why not `fmt.Println(v)`? Because `v` is a `reflect.Value`;
we want the concrete value it holds.) Since our value is a `float64`,
we can even use a floating-point format if we want:

	fmt.Printf("value is %7.1e\n", v.Interface())

and get in this case

	3.4e+00

Again, there's no need to type-assert the result of `v.Interface()` to `float64`;
the empty interface value has the concrete value's type information inside
and `Printf` will recover it.

In short, the `Interface` method is the inverse of the `ValueOf` function,
except that its result is always of static type `interface{}`.

Reiterating: Reflection goes from interface values to reflection objects and back again.

## The third law of reflection

## 3. To modify a reflection object, the value must be settable.

The third law is the most subtle and confusing, but it's easy enough to understand if we start from first principles.

Here is some code that does not work, but is worth studying.

	var x float64 = 3.4
	v := reflect.ValueOf(x)
	v.SetFloat(7.1) // Error: will panic.

If you run this code, it will panic with the cryptic message

	panic: reflect.Value.SetFloat using unaddressable value

The problem is not that the value `7.1` is not addressable;
it's that `v` is not settable.
Settability is a property of a reflection `Value`,
and not all reflection `Values` have it.

The `CanSet` method of `Value` reports the settability of a `Value`; in our case,

	var x float64 = 3.4
	v := reflect.ValueOf(x)
	fmt.Println("settability of v:", v.CanSet())

prints

	settability of v: false

It is an error to call a `Set` method on an non-settable `Value`. But what is settability?

Settability is a bit like addressability, but stricter.
It's the property that a reflection object can modify the actual storage
that was used to create the reflection object.
Settability is determined by whether the reflection object holds the original item. When we say

	var x float64 = 3.4
	v := reflect.ValueOf(x)

we pass a copy of `x` to `reflect.ValueOf`,
so the interface value created as the argument to `reflect.ValueOf` is a
copy of `x`, not `x` itself.
Thus, if the statement

	v.SetFloat(7.1)

were allowed to succeed, it would not update `x`,
even though `v` looks like it was created from `x`.
Instead, it would update the copy of `x` stored inside the reflection value
and `x` itself would be unaffected.
That would be confusing and useless, so it is illegal,
and settability is the property used to avoid this issue.

If this seems bizarre, it's not. It's actually a familiar situation in unusual garb.
Think of passing `x` to a function:

	f(x)

We would not expect `f` to be able to modify `x` because we passed a copy
of `x`'s value, not `x` itself.
If we want `f` to modify `x` directly we must pass our function the address
of `x` (that is, a pointer to `x`):

	f(&x)

This is straightforward and familiar, and reflection works the same way.
If we want to modify `x` by reflection, we must give the reflection library
a pointer to the value we want to modify.

Let's do that. First we initialize `x` as usual and then create a reflection value that points to it, called `p`.

	var x float64 = 3.4
	p := reflect.ValueOf(&x) // Note: take the address of x.
	fmt.Println("type of p:", p.Type())
	fmt.Println("settability of p:", p.CanSet())

The output so far is

	type of p: *float64
	settability of p: false

The reflection object `p` isn't settable,
but it's not `p` we want to set, it's (in effect) `*p`.
To get to what `p` points to, we call the `Elem` method of `Value`,
which indirects through the pointer, and save the result in a reflection `Value` called `v`:

	v := p.Elem()
	fmt.Println("settability of v:", v.CanSet())

Now `v` is a settable reflection object, as the output demonstrates,

	settability of v: true

and since it represents `x`, we are finally able to use `v.SetFloat` to modify the value of `x`:

	v.SetFloat(7.1)
	fmt.Println(v.Interface())
	fmt.Println(x)

The output, as expected, is

	7.1
	7.1

Reflection can be hard to understand but it's doing exactly what the language does,
albeit through reflection `Types` and `Values` that can disguise what's going on.
Just keep in mind that reflection Values need the address of something in
order to modify what they represent.

## Structs

In our previous example `v` wasn't a pointer itself,
it was just derived from one.
A common way for this situation to arise is when using reflection to modify
the fields of a structure.
As long as we have the address of the structure,
we can modify its fields.

Here's a simple example that analyzes a struct value, `t`.
We create the reflection object with the address of the struct because we'll
want to modify it later.
Then we set `typeOfT` to its type and iterate over the fields using straightforward
method calls (see [package reflect](https://golang.org/pkg/reflect/) for details).
Note that we extract the names of the fields from the struct type,
but the fields themselves are regular `reflect.Value` objects.

	type T struct {
	    A int
	    B string
	}
	t := T{23, "skidoo"}
	s := reflect.ValueOf(&t).Elem()
	typeOfT := s.Type()
	for i := 0; i < s.NumField(); i++ {
	    f := s.Field(i)
	    fmt.Printf("%d: %s %s = %v\n", i,
	        typeOfT.Field(i).Name, f.Type(), f.Interface())
	}

The output of this program is

	0: A int = 23
	1: B string = skidoo

There's one more point about settability introduced in passing here:
the field names of `T` are upper case (exported) because only exported fields
of a struct are settable.

Because `s` contains a settable reflection object, we can modify the fields of the structure.

	s.Field(0).SetInt(77)
	s.Field(1).SetString("Sunset Strip")
	fmt.Println("t is now", t)

And here's the result:

	t is now {77 Sunset Strip}

If we modified the program so that `s` was created from `t`,
not `&t`, the calls to `SetInt` and `SetString` would fail as the fields
of `t` would not be settable.

## Conclusion

Here again are the laws of reflection:

  - Reflection goes from interface value to reflection object.

  - Reflection goes from reflection object to interface value.

  - To modify a reflection object, the value must be settable.

Once you understand these laws reflection in Go becomes much easier to use,
although it remains subtle.
It's a powerful tool that should be used with care and avoided unless strictly necessary.

There's plenty more to reflection that we haven't covered — sending and
receiving on channels,
allocating memory, using slices and maps,
calling methods and functions — but this post is long enough.
We'll cover some of those topics in a later article.
