// interface_nil.go
package main

import "fmt"

type Any interface {}
type Anything struct {}

func main() {
	any := getAny()
	if any == nil {
		fmt.Println("any is nil")
	} else {
		fmt.Println("any is not nil")
	}
/*
	// to get the inner value:
	anything := any.(*Anything) 
	if anything == nil {
		fmt.Println("anything is nil")
	} else {
		fmt.Println("anything is not nil")
	}
*/
}

func getAny() Any {
	return getAnything()
}

func getAnything() *Anything {
	return nil
}

/* Output:
any is not nil
WHY?
you would perhaps expect: any is nil,because getAnything() returns that
BUT:
the interface value any is storing a value, so it is not nil. 
It just so happens that the particular value it is storing is a nil pointer.
The any variable has a type, so it's not a nil interface, 
rather an interface variable with type Any and concrete value (*Anything)(nil).
To get the inner value of any, use: anything := any.(*Anything)
now anything contains nil !
*/
