go-engine 0.1.5

The wrapper of the Goscript project.
Documentation
package main

import (
    "fmt2"
    "reflect"
)


type AAA int

var i = 222

type Bbb struct {
    A string
    B int
    C int
    D bool
}

type Ccc struct {
    I int
    I8 int8
    I16 int16
    I32 int32
    I64 int64
    U uint
    U8 uint8
    U16 uint16
    U32 uint32
    U64 uint64
    F32 float32
    F64 float64
}

func get() AAA {
    return AAA(i)
}


func get2() AAA {
    return AAA(6*3)
}

func testBytes() {
    a := []byte{111,112,113}
    v := reflect.ValueOf(a);
    b := v.Bytes()
    assert(a[0] == b[0])
    assert(a[1] == b[1])
    assert(a[2] == b[2])
}

func testValueElem() {
    t := 8
    i := &t
    v := reflect.ValueOf(i)
    re := v.Elem()
    fmt2.Println(v, re)
}

func testField() {
    b := Bbb{"xxx", 123, 0, false}
    v := reflect.ValueOf(b)
    assert(v.NumField() == 4)
   // assert(v.Field(1).Int() == 123)
    fmt2.Println(v, v.Field(1).Int())
}

func testVals() {
    var i int16 = 555
    assert(reflect.ValueOf(i).Int() == 555)

    var j uint32 = 666
    assert(reflect.ValueOf(j).Uint() == 666)

    var k float32 = 3.5
    assert(reflect.ValueOf(k).Float() == 3.5)
}

func testIndex() {
    a := []int{23,34,56}
    v := reflect.ValueOf(a)  
    assert(v.Index(1).Int() == 34)

    b := "abcd"
    v = reflect.ValueOf(b)  
    assert(v.Index(1).Uint() == 'b')

    c := [3]int{23,34,56}
    v = reflect.ValueOf(c)  
    assert(v.Index(2).Int() == 56)
    
}

func testIsNil() {
    var m map[int]string
    var s []string
    assert(reflect.ValueOf(m).IsNil())
    assert(reflect.ValueOf(s).IsNil())
}


func testIsValid() {
    var m map[int]string
    v := reflect.ValueOf(m)
    var v1 reflect.Value
    assert(v.IsValid())
    assert(!v1.IsValid())
}

func testLen() {
    m := map[int]string{1:"a"}
    var s []int
    v := reflect.ValueOf(m)
    v1 := reflect.ValueOf(s)
    assert(v.Len() == 1)
    assert(v1.Len() == 0)
}

func testMapIter() {
    m := map[int]string{66:"a"}
    v := reflect.ValueOf(m)
    iter := v.MapRange()
    assert(iter.Next())
    assert(iter.Key().Int() == 66)
    assert(!iter.Next())
}

func testPointer() {
    var i uintptr
	i <<= 1
	i += 1
	i <<= 3
	var j int
	j = 9
	i = (uintptr)(j)
    f := float32(i)
    assert(f == 9)

    fmt2.Println(reflect.ValueOf(i).Pointer())
}

func testSet() {
    assert(!reflect.ValueOf("").CanSet())

    var bbb Bbb
    bv := reflect.ValueOf(bbb);
    bv0 := bv.Field(0)
    bv2 := bv.Field(2)    
    bv3 := bv.Field(3)    
    assert(bv0.CanSet())
    assert(bv2.CanSet())
    assert(bv3.CanSet())
    assert(!bv3.Bool())
    bv3.SetBool(true)
    assert(bv3.Bool())
    
    a := []int{23,34,56}
    v := reflect.ValueOf(a)   
    v1 := v.Index(1)
    assert(v1.CanSet())
    
    v1.Set(reflect.ValueOf(888))
    assert(v.Index(1).Int() == 888)

    bv0.SetString("kkk")
    assert(bbb.A == "")
    
    {
        b := new([]byte)
        v := reflect.ValueOf(b).Elem()
        v.SetBytes([]byte{1,239,3})
        assert((*b)[1] == 239)
    }

    {/*
        native := ffi(ffiReflect, "reflect")
        i := 1
        j := 2
        pi := native.value_of(i)
        ppi := native.value_of(pi)
        pj := native.value_of(j)
        native.set_pointer(ppi, pj)
    */
    }

    {
        var ccc Ccc
        v := reflect.ValueOf(ccc);
        for i := 0; i < 5; i++ {
            cf := v.Field(i)
            cf.SetInt(8)
            assert(cf.Int() == 8)
        }
        for i := 5; i < 10; i++ {
            cf := v.Field(i)
            cf.SetUint(9)
            assert(cf.Uint() == 9)
        }
        for i := 10; i < 12; i++ {
            cf := v.Field(i)
            cf.SetFloat(10)
            assert(cf.Float() == 10)
        }
        
        var i interface{} = ccc.I16
        _, ok := i.(int16)
        assert(ok)
        i = ccc.U32
        _, ok = i.(uint32)
        assert(ok)
        i = ccc.F32
        _, ok = i.(float32)
        assert(ok)
    }

}


func main() {
    
    testBytes()
    
    testValueElem()
    
    testField()

    testVals()

    testIndex()

    testIsNil()

    testIsValid()

    testLen()

    testMapIter()
    
    testPointer()
    
    testSet() 

    
    //i := reflect.TypeOf(get)
    //j := reflect.TypeOf(get2)
    //assert(i == j)
    //fmt2.Println(get2(), get(), i, j, i == j, reflect.ValueOf(get).Pointer())
    
}