Go语言语法汇总(转)

Go语言语法汇总

分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报

go语言golang并发语法

目录(?)[+]

最近看了看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核数
时间: 2024-10-15 18:50:28

Go语言语法汇总(转)的相关文章

Lua语言基础汇总(3) -- 语句

赋值 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许“多重赋值”,也就是一下子将多个值赋予多个变量,例如以下代码: 1 2 3 local x1, x2 = 2, 4 print(x1)     -->2 print(x2)     -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值,例如以下用法,可以非常简便的交换两个元素的值: 1 2 3 4 local x1, x2 = 2, 4 x1, x2 

Lua语言基础汇总(6)-- 迭代器与泛型for

前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 1 2 3 4 5 6 7 8 9 10 11 12 function values(tb)      local i = 0      return function (

Lua语言基础汇总(13)-- Lua中一些常用的库

前言 这篇文章将会来一些比较轻松的内容,就是简单的介绍一下Lua中几个常用的库.简单的说就是几个API的介绍.所以说,看起来比较容易,也没有多大的分量.就是纯粹的总结.使用库就是为了方便我们的开发,提高开发效率,同时也能保证代码的质量.希望大家以后也不要重复造轮子了. 数学库 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 1. 三角函数(sin,cos,tan……) 所有的三角函数都使用弧度单位,可以用函数deg(角度)和rad(弧度)来转

Lua语言基础汇总(12)-- Lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 1 2 3 4 5 6 7 8 9 10 11 12 local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 pri

Lua语言基础汇总(2) -- 表达式

算术操作符 Lua支持常规的算术操作符有:”+”(加法),”-”(减法),”*”(乘法),”/”(除法),”^”(指数),”%”(取模),一元的”-”(负号).所有的这些操作符都用于实数.例如:x^0.5将计算x的平方根,x^3将计算x的3次方. 关系操作符 Lua提供的关系操作符有:”<”,”>”,”<=”,”>=”,”==”,”~=”:所有这些操作符的运算结果都是true或false. 操作符==用于相等性测试,操作符~=用于不等性测试.这两个操作符可以应用于任意两个值.如果两

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接

Lua语言基础汇总(4) -- 函数

Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: 1 2 3 function MyFunc(param)      -- Do something end 在调用函数时,也需要将对应的参数放在一对圆括号中,即使调用函数时没有参数,也必须写出一对空括号.对于这个规则只有一种特殊的例外情况:一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么圆括号便可以省略掉.看以下代码: 1 2 3 4 5 6 print "Hello World"      

DBA_基本Bash语法汇总

 2014-06-26 BaoXinjian 一.变量 1.变量命名可使用英文字母.数字和下划线,必须以英文字母开头,区分大小写. 2.每个shell都拥有自己的变量定义,彼此互不影响. 3.变量直接以等号赋值,注意等号两边不可留空,若等号右侧有空格,赋值要用引号括起来. 例如: test=1 test='hello world' 4.通过在变量名前加$的方式获取变量的值.或者使用${变量名}的形式,以利于变量名和紧接其后的字母或下划线进行区分. 例如:${test} 5.通过${#变量}的形式

[转]Lua语言基础汇总(6)-- 迭代器与泛型for

前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 1 2 3 4 5 6 7 8 9 10 11 12 function values(tb)      local i = 0      return function (