Go语言的语句很简单,写起来像是动态语言那样简单。不过虽说代码符号简单,但是刚刚接触的时候却是有些不适应,这里就先把使用 GoRK3288库 的时候需要用到的语法列举一下,其他高深的东西以后再去学习吧。
1.操作符:
+、-、*、/、%、&、|、^、<<、>>、==、!=、|= 等这些和C语言是一样的,不过在取反的时候就不是~符号了,而是^。跟亦或是同一个符号,怎么区分呢?单目操作是取反,双目操作是亦或。另外要将某一位置0的话 &= ^x是不对的,而是 &^= x,切记。
2.变量:
变量的声明可以用var来标识,如var i int = 0,变量名在前,类型在后,而且语句的结束不需要分号。对多个变量 赋初值var i, j = 0, 0
和某些动态语言类似,Go的变量可以不需要事先声明,可以根据函数的返回值自动判断变量的类型。如
i := GetIndex()。根据函数GetIndex()返回值的类型自动赋值给变量i,不过需要注意的是操作符变为 :=了,而对于已经声明的变量直接使用 = 来赋值。
3. 返回值:
返回值是Go语言和其他语言变化最大的地方之一,Go语言支持多返回值。例如:
func GetInfo() (Index int, Info string, Result float32) {}
一下子返回了三个值,而不需要再去定义个结构体,方便了很多。而且如果只想使用一个返回值而不关心其他的值的时候,可以这样接收:index, _, _ := GetInfo(),实在太方便了。
4.线程(协程):
前面说过,Go对于高并发做的很好,而高并发是通过多线程来实现的。在Go里使用的所谓线程,其实是一种比线程资源开销更小的协程,仅仅比堆栈占用的资源高一点点,所以理论上可以创建几十万个协程来并行工作。当然这只是理论上,不过创建几千个上万个协程一般足够使用了。
5.通道:
Go语言提供的消息通信机制被称为channel,可以在语言级别提供的goroutine间的通信方式。“不要通过共享内存来通信,而应该通过通信来共享内存。”,这句话说的就是通道在Go语言中的作用。通道的使用方法多种多样,一般先是定义个通道,一方写,另一方读,而读的一方在有消息到达前是阻塞的。例如:
ch := make(chan int) //创建通道
ch <- 1 //写消息到通道
msg := <- ch //从通道读消息到一个变量中
而其他更多的用法是 select ,暂时用不到就不说了,希望了解详细用法的话请查询手册。
6. 流程控制:
if x == y { return } //条件判断部分没有()
没有while ... do ...或 do... while ...,Go语言里只有for {}
switch (x) {
case A:
case B, C, D: fallthrough
default: return
}
switch 不像C中用break来结束每一个case,如果需要的话使用fallthrough来达到这种效果。
7.Go关键字:
break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var
8.Go类型:
byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float32 float64 complex64 complex128 uintptr string
9.工程文件:
Go语言其实没有工程文件这个东西,类似的概念其实就是文件夹,根据文件夹包括的go文件以及引用情况来决定是否在一个工程内。但是每一个工程都必须有一个入口点,必须是package main来开头的,func main() {} 作为主函数所在的文件。有了这个文件才能正确的编译和运行。
暂且想到这么多,其他用到的东西以后再补充。
语法大概了解了,再来看看GoRK3288项目工程文件的结构。
目前包括的文件有:
1.RK3288.go
2.GRF.go
3.GPIO.go
4.PWM.go
5.TSADC.go
6.WDT.go
....
首先RK3288.go文件是一个基础文件, 对于内存的映射和释放是由它来完成的。这个文件本身和RK3288没有关系,一般不需要使用,只是在工程的开始时需要调用一句 defer RK3288.FreeRK3288() 用于在程序退出时释放资源。
其次是GRF.go文件,它的作用是设置RK3288每个端口的功能复用。当然已经被封装好,不需要直接调用。
这两个文件对工程而言是必须的,缺少将不能编译。其他的文件功能和文件名是一样的,不用多说,用不到的可以不包括在工程中。
每个文件的使用方法后面陆续说明。
1.操作符:
+、-、*、/、%、&、|、^、<<、>>、==、!=、|= 等这些和C语言是一样的,不过在取反的时候就不是~符号了,而是^。跟亦或是同一个符号,怎么区分呢?单目操作是取反,双目操作是亦或。另外要将某一位置0的话 &= ^x是不对的,而是 &^= x,切记。
2.变量:
变量的声明可以用var来标识,如var i int = 0,变量名在前,类型在后,而且语句的结束不需要分号。对多个变量 赋初值var i, j = 0, 0
和某些动态语言类似,Go的变量可以不需要事先声明,可以根据函数的返回值自动判断变量的类型。如
i := GetIndex()。根据函数GetIndex()返回值的类型自动赋值给变量i,不过需要注意的是操作符变为 :=了,而对于已经声明的变量直接使用 = 来赋值。
3. 返回值:
返回值是Go语言和其他语言变化最大的地方之一,Go语言支持多返回值。例如:
func GetInfo() (Index int, Info string, Result float32) {}
一下子返回了三个值,而不需要再去定义个结构体,方便了很多。而且如果只想使用一个返回值而不关心其他的值的时候,可以这样接收:index, _, _ := GetInfo(),实在太方便了。
4.线程(协程):
前面说过,Go对于高并发做的很好,而高并发是通过多线程来实现的。在Go里使用的所谓线程,其实是一种比线程资源开销更小的协程,仅仅比堆栈占用的资源高一点点,所以理论上可以创建几十万个协程来并行工作。当然这只是理论上,不过创建几千个上万个协程一般足够使用了。
5.通道:
Go语言提供的消息通信机制被称为channel,可以在语言级别提供的goroutine间的通信方式。“不要通过共享内存来通信,而应该通过通信来共享内存。”,这句话说的就是通道在Go语言中的作用。通道的使用方法多种多样,一般先是定义个通道,一方写,另一方读,而读的一方在有消息到达前是阻塞的。例如:
ch := make(chan int) //创建通道
ch <- 1 //写消息到通道
msg := <- ch //从通道读消息到一个变量中
而其他更多的用法是 select ,暂时用不到就不说了,希望了解详细用法的话请查询手册。
6. 流程控制:
if x == y { return } //条件判断部分没有()
没有while ... do ...或 do... while ...,Go语言里只有for {}
switch (x) {
case A:
case B, C, D: fallthrough
default: return
}
switch 不像C中用break来结束每一个case,如果需要的话使用fallthrough来达到这种效果。
7.Go关键字:
break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var
8.Go类型:
byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float32 float64 complex64 complex128 uintptr string
9.工程文件:
Go语言其实没有工程文件这个东西,类似的概念其实就是文件夹,根据文件夹包括的go文件以及引用情况来决定是否在一个工程内。但是每一个工程都必须有一个入口点,必须是package main来开头的,func main() {} 作为主函数所在的文件。有了这个文件才能正确的编译和运行。
暂且想到这么多,其他用到的东西以后再补充。
语法大概了解了,再来看看GoRK3288项目工程文件的结构。
目前包括的文件有:
1.RK3288.go
2.GRF.go
3.GPIO.go
4.PWM.go
5.TSADC.go
6.WDT.go
....
首先RK3288.go文件是一个基础文件, 对于内存的映射和释放是由它来完成的。这个文件本身和RK3288没有关系,一般不需要使用,只是在工程的开始时需要调用一句 defer RK3288.FreeRK3288() 用于在程序退出时释放资源。
其次是GRF.go文件,它的作用是设置RK3288每个端口的功能复用。当然已经被封装好,不需要直接调用。
这两个文件对工程而言是必须的,缺少将不能编译。其他的文件功能和文件名是一样的,不用多说,用不到的可以不包括在工程中。
每个文件的使用方法后面陆续说明。
有疑问加站长微信联系(非本文作者)