Firefly开源社区

标题: 【GoRK3288】2.Go语法简要说明及GoRK3288结构 [打印本页]

作者: tjCFeng    时间: 2015-5-10 12:46
标题: 【GoRK3288】2.Go语法简要说明及GoRK3288结构
   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每个端口的功能复用。当然已经被封装好,不需要直接调用。
    这两个文件对工程而言是必须的,缺少将不能编译。其他的文件功能和文件名是一样的,不用多说,用不到的可以不包括在工程中。
    每个文件的使用方法后面陆续说明。


    GoRK3288库请在https://github.com/tjCFeng/GoRK3288下载。




作者: lichundong    时间: 2016-7-11 10:17
受教了谢谢分享!!!
作者: williamzhang    时间: 2018-10-23 12:18
用go做这些,真的感觉黑科技了
作者: shuxiad    时间: 2020-12-14 17:59
厉害了




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1