Gox语言中的结构类型-GX10.1

Gox在春天

Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型。对映射也支持一般的使用“.”的类似成员变量的访问方法(注意,Gox中为了简化指针操作对解释器的分析难度,所以用“.”获得的成员都是值类型,而用另一个操作符“@”获得的则是引用/指针类型的)。

因此,Gox语言中的结构体struct一般是为了兼容Go语言中的结构体,以便调用Go语言中已有的库函数或者该结构体的成员函数,请参看下面的示例。

// 创建一个Go语言标准库中net/http包内的Client结构/对象
// 并在创建时对其成员Timeout赋以初值15秒
// 由于数据类型的要求,必须强制转换为time.Duration类型
client1T = &net_http.Client{Timeout: time.Duration(15 * time.Second)}

// 这样创建出来的是一个指针/引用
pl("%#v", client1T)

// 用内置函数new也可以创建Go语言中的结构体或对象,获得的也是指针
client2T = new(net_http.Client)

pl("%#v", client2T)

// 然后可以对其字段进行单独赋值
client2T.Timeout = time.Duration(30)

pl("%#v", client2T)

这段代码中已经有了详细的注释,运行结果是:

λ gox struct.gox
&http.Client{Transport:http.RoundTripper(nil), CheckRedirect:(func(*http.Request, []*http.Request) error)(nil), Jar:http.CookieJar(nil), Timeout:15000000000} 
&http.Client{Transport:http.RoundTripper(nil), CheckRedirect:(func(*http.Request, []*http.Request) error)(nil), Jar:http.CookieJar(nil), Timeout:0}
&http.Client{Transport:http.RoundTripper(nil), CheckRedirect:(func(*http.Request, []*http.Request) error)(nil), Jar:http.CookieJar(nil), Timeout:30}

首先,Gox语言中没有直接声明结构体的方法,因为作为动态类型的语言,所有类型都是无法声明的,但可以用类似Go语言中“a = &MyStruct{}”这样的方法来创建结构体,或用make函数直接创建一个结构类型这样获得的是结构体的值对象,而用new函数获得的则是该结构体类型的指针(或称引用),然后就可以用“.”的方法来引用结构体中的成员变量或用“@”来获取成员变量的指针。

如果把另一个变量赋值为以后的结构体变量,实际上只是赋值了引用。

如果需要给结构体附加方法(即成员函数),Gox语言中可以提供对象类的概念,在后文中会进行介绍。

最后,顺带一提,make函数还可以用于创建一些Go语言内置的复合类型,例如:

e = make([]int, len, cap) // 创建一个 int slice,并将长度设置为 len,容量设置为 cap
f = make([][]int, len, cap) // 创建一个 []int 的 slice,并将长度设置为 len,容量设置为 cap

e = make(map[string]int) // 创建一个空的 map[string]int 类型的对象
f = make(map[string]map[string]int) // 创建一个 map[string]map[string]int 类型的对象

ch1 = make(chan bool, 2) // 得到 buffer = 2 的 chan bool
ch2 = make(chan int) // 得到 buffer = 0 的 chan int
ch3 = make(chan map[string]int) // 得到 buffer = 0 的 chan map[string]int