最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考

数据类型


  • var varName typevar var1,var2… typevar varName type = Valuevar varName1,varName2 type = Value1,Value2var varName1,varName2=Value1,Value2varName1,varName2:=Value1,Value2,定义数据类型。

  • 声明了没有被使用的变量将在编译时报错。

  • 常量定义: const varName = Value , const varName type = Value

  • string字符串类型值不可改变,但是可以切片,字符串可以使用+进行连接

  • iota用来声明enum,表示自加1,初始为0

  • var arrayName [N]type用来声明数组,或者使用 arrayName := [N]type{ v1,v2…}来声明

  • 数组声明可以嵌套

  • slice用来表示切片,声明方式var sliceName []type或者sliceName := []type{v1,v2…}

  • slice保存的是引用而非实体

  • slice中有一些内置函数,len获取长度,cap获取最大容量,append追加数据,copy用来拷贝数据

  • map声明方式为var mapName map[keyType] valueType或者mapName := make(map[keyType]valueType)

  • map可通过 key : value 初始化

  • make用于内建类型的内存分配,new用于各种类型的内存分配,new返回指针而make返回非0的值

流程控制


  • if语句不需要括号,在if语句中可以声明变量,用分好分割if语句的条件判断

      if x:=function();x<10 {
    fmt.Printf("x < 10,%d\n",x);
    }else{
    fmt.Print("x >= 10 ,%d\n",x);
    }
  • goto语句类似C语言,但是跳转到必须在当前函数内定义的标签

  • for语句类似C语言,但是breakcontinue可以跟标号,跳出多重循环。

  • switch语句不用break,如果想强行执行下面的case可以使用fallthrough

函数


声明方式:

func funcName(input1 type1, input2 type2) (output1 type1, output2 type2)
  • func用来声明函数,函数名为funcName,后面跟输入,输出的数据类型。

  • 函数可以有多个返回值

  • 函数的值操作和指针操作类似C语言,内置类型中的string,slice,map直接使用的是类似的指针传递,不用使用取地址符,但是,如果需要改变slice的长度,则需要取地址穿指针。

  • defer语句用来表示在函数返回前执行的语句。

  • type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])用来声明一个函数类型,主要用于高阶函数中。

  • import用来导入包,package用来导出包,包操作使用.操作符

Struct类型


  • 声明方式:

      type Person struct {
    name string
    age int
    }
  • 匿名方式,匿名方式下A含有B的所有类型

      type Student struct {
    Person // 默认Person的所有字段
    speciality string
    }
  • 如果匿名类型中有字段和本身有冲突,可以使用匿名类型+.访问

  • 类型的方法声明:

      func (r ReceiverType) funcName(parameters) (results)
  • 可以使用:type typeName typeLiteral来自定义类型,定义完以后可以使用方法来扩展类型的功能。

  • 需要改变struct内部的值时,需要将ReceiverType定义为*指针类型,但是调用的时候不需要,go语言自动帮你完成了。

  • 方法可以继承,可以重载

interface接口


  • type InterfaceName interface用来定义inerface

  • interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。

  • 空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface

  • 一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值

  • value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,elementinterface变量,T是断言的类型,如果oktrue则表示,element确实是T类型的。

  • interface可以嵌套

并发


  • 使用go关键字+函数名实现并发

  • 使用channel实现线程间通讯,channel通过make构造,使用<-来发送和接受数据。

  • chanchannel的关键字,后面跟数据类型ch <- v发送数据,v:=<-ch接收数据,chchan类型。

      package main
    import "fmt"
    func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
    total += v
    }
    c <- total // send total to c
    } func main() {
    a := []int{7, 2, 8, -9, 4, 0}
    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c // receive from c
    fmt.Println(x, y, x + y)
    }
  • channel默认是阻塞形式的,可以进行线程同步。

  • ch := make(chan type, value)构造channel时可通过设置不同的value来设定channl的buffer长度。

  • close用来关闭channel

  • 使用select+case来选择多个channel

  • 使用select + case <- time.After(5 * time.Second)来设定超时

  • Goexit 退出当前执行的goroutine,但是defer函数还会继续调用

  • Gosched 让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。

  • NumCPU 返回 CPU 核数量

  • NumGoroutine 返回正在执⾏行和排队的任务总数

  • GOMAXPROCS 用来设置可以运行的CPU核数

Go语言语法汇总的更多相关文章

  1. Go语言语法汇总(转)

    Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法   目录(?)[+]   最近看了看GoLang,把Go语言的语法 ...

  2. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  3. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  4. R语言语法基础二

    R语言语法基础二 重塑数据 增加行和列 # 创建向量 city = c("Tampa","Seattle","Hartford"," ...

  5. R语言语法基础一

    R语言语法基础一 Hello world #这里是注释 myString = "hello world" print(myString) [1] "hello world ...

  6. L脚本语言语法手冊 0.10版

    L脚本语言语法手冊 0.10版       简  介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...

  7. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  8. Go语言语法说明

    Go语言语法说明 go语言中的go func(){}() 表示以并发的方式调用匿名函数func 深入讲解Go语言中函数new与make的使用和区别 前言 本文主要给大家介绍了Go语言中函数new与ma ...

  9. PL真有意思(二):程序设计语言语法

    前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...

随机推荐

  1. 给兄弟说下如何处理Debian下常见的apache2的几个问题

    这段时间总是有兄弟问到在linux下的apache2配置,其实很简单,这里统一答复下. 一.安装 当然是apt-get install 最简单了, 顺便把php5和GD什么的一起装上吧,基本上不用配置 ...

  2. 认识元数据和IL(上) <第三篇>

    说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么 ...

  3. sh里没有多行注释,只能每一行加一个#号

    sh里没有多行注释,只能每一行加一个#号.只能像这样: #-------------------------------------------- # 这是一个自动打ipa的脚本,基于webfrogs ...

  4. GridBagLayout占多行效果注意

    如果想要出现按钮2占两行的效果,必须按键3.按钮4同时存在且同时可见. 如果缺少按钮4,则按钮2不会占两行: 如果缺少按钮3.4,则按钮2也不会占两行. package com.wst.bj; imp ...

  5. Windows7&IIS7.5部署Discuz

    IIS CGI一定要安装 IIS 网站中添加关联程序 ,添加默认文档 http://www.cnblogs.com/ajunForNet/archive/2012/09/12/2682063.html

  6. Winpcap网络编程九之Winpcap实战,ARP协议获得MAC表及主机通信

    大家好,本次我们须要完毕的任务是: 完毕两台主机之间的数据通信(数据链路层) 仿真ARP协议获得网段内主机的MAC表 使用帧完毕两台主机的通信(Hello! I'm -) 声明:本文章的目的是为大家的 ...

  7. Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式

    tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态. ...

  8. onvif规范的实现:使用gSOAP创建SOAP调用实例

    预备知识 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供.ONVIF规范涵盖了完全的XML及WSDL的定义.每一个支持ONVIF规范的终端设备均须提供与功能相应的 ...

  9. (转)android多国语言适配

    android多国语言文件夹 android多国语言文件夹文件汇总如下:(有些语言的书写顺序可能跟中文是相反的) 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中 ...

  10. Linq 查询基本操作

    - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 - let 子句 - 复合from子句 - 在某 ...