]> Cypherpunks repositories - gostls13.git/commitdiff
add method Value() Value to InterfaceValue.
authorRuss Cox <rsc@golang.org>
Tue, 7 Apr 2009 04:28:04 +0000 (21:28 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 7 Apr 2009 04:28:04 +0000 (21:28 -0700)
use Value() in print to print underlying value
from interface.

before:
package main
import "fmt"
func main() {
x := []interface{} {1, "hello", 2.5};
fmt.Println(x[0], x[1], x[2], x);
}

1 hello 2.5 [<non-nil interface> <non-nil interface> <non-nil interface>]

after:
1 hello 2.5 [1 hello 2.5]

R=r
DELTA=44  (22 added, 16 deleted, 6 changed)
OCL=27139
CL=27141

src/lib/fmt/fmt_test.go
src/lib/fmt/print.go
src/lib/reflect/all_test.go
src/lib/reflect/value.go

index 34acab08be1c212dfbcb43955e46f7413c84037b..e4158624b0e35de7de141483deacc508abf712e3 100644 (file)
@@ -29,7 +29,7 @@ type fmtTest struct {
 const b32 uint32 = 1<<32 - 1
 const b64 uint64 = 1<<64 - 1
 var array = []int{1, 2, 3, 4, 5}
-
+var iarray = []interface{}{1, "hello", 2.5, nil}
 
 var fmttests = []fmtTest{
        // basic string
@@ -80,10 +80,10 @@ var fmttests = []fmtTest{
        fmtTest{ "% d",         -12345, "-12345" },
 
        // arrays
-       // TODO: when arrays work in interfaces, enable this line
-       // and delete the TestArrayPrinter routine below
-       // fmtTest{ "%v",               array,                  "[1 2 3 4 5]" },
+       fmtTest{ "%v",          array,                  "[1 2 3 4 5]" },
+       fmtTest{ "%v",          iarray,                 "[1 hello 2.5 <nil>]" },
        fmtTest{ "%v",          &array,                 "&[1 2 3 4 5]" },
+       fmtTest{ "%v",          &iarray,                        "&[1 hello 2.5 <nil>]" },
 
        // old test/fmt_test.go
        fmtTest{ "%d",          1234,                   "1234" },
@@ -240,17 +240,3 @@ func TestStructPrinter(t *testing.T) {
                }
        }
 }
-
-func TestArrayPrinter(t *testing.T) {
-       a := []int{1, 2, 3, 4, 5};
-       want := "[1 2 3 4 5]";
-       out := fmt.Sprintf("%v", a);
-       if out != want {
-               t.Errorf("Sprintf(%%v, array) = %q, want %q", out, want);
-       }
-       want = "&" + want;
-       out = fmt.Sprintf("%v", &a);
-       if out != want {
-               t.Errorf("Sprintf(%%v, &array) = %q, want %q", out, want);
-       }
-}
index ca5bec93414ac7be1a2a0927d16c0b31df394c15..5fd230f2ce4cb8560495274e20e1957c1d416137 100644 (file)
@@ -451,12 +451,11 @@ func (p *pp) printField(field reflect.Value) (was_string bool) {
                }
                p.add('}');
        case reflect.InterfaceKind:
-               inter := field.(reflect.InterfaceValue).Get();
-               if inter == nil {
+               value := field.(reflect.InterfaceValue).Value();
+               if value == nil {
                        s = "<nil>"
                } else {
-                       // should never happen since a non-nil interface always has a type
-                       s = "<non-nil interface>";
+                       return p.printField(value);
                }
        default:
                s = "?" + field.Type().String() + "?";
index 166b20702f92f32280adebe38b6d2907151d4d0b..e3f6b9b506ff856ba11f34495f567970d4aed944 100644 (file)
@@ -301,6 +301,16 @@ func TestInterfaceGet(t *testing.T) {
        assert(v3.Type().String(), "float");
 }
 
+func TestInterfaceValue(t *testing.T) {
+       var inter struct { e interface{ } };
+       inter.e = 123.456;
+       v1 := reflect.NewValue(&inter);
+       v2 := v1.(reflect.PtrValue).Sub().(reflect.StructValue).Field(0);
+       assert(v2.Type().String(), "interface { }");
+       v3 := v2.(reflect.InterfaceValue).Value();
+       assert(v3.Type().String(), "float");
+}
+
 func TestCopyArray(t *testing.T) {
        a := []int{ 1, 2, 3, 4, 10, 9, 8, 7 };
        b := []int{ 11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44 };
index 7bd6f3b153345ceb7548b8e3c5ad348bdeb9d518..ad0cd465563236abf6b40a4cfbbc61a8f6454bfb 100644 (file)
@@ -34,6 +34,8 @@ type Value interface {
        Interface()     interface {};
 }
 
+func NewValue(e interface{}) Value;
+
 // commonValue fields and functionality for all values
 
 type commonValue struct {
@@ -744,6 +746,7 @@ func structCreator(typ Type, addr Addr) Value {
 type InterfaceValue interface {
        Value;
        Get()   interface {};   // Get the underlying interface{} value.
+       Value() Value;
 }
 
 type interfaceValueStruct struct {
@@ -754,6 +757,14 @@ func (v *interfaceValueStruct) Get() interface{} {
        return *(*interface{})(v.addr)
 }
 
+func (v *interfaceValueStruct) Value() Value {
+       i := v.Get();
+       if i == nil {
+               return nil;
+       }
+       return NewValue(i);
+}
+
 func interfaceCreator(typ Type, addr Addr) Value {
        return &interfaceValueStruct{ commonValue{InterfaceKind, typ, addr} }
 }