Go语言语法汇总
最近看了看GoLang,把Go语言的语法总结了一下,做个快速参考
数据类型
var varName type,var var1,var2… type,var varName type = Value,var varName1,varName2 type = Value1,Value2,var varName1,varName2=Value1,Value2,varName1,varName2:=Value1,Value2,定义数据类型。声明了没有被使用的变量将在编译时报错。
常量定义:
const varName = Value,const varName type = Valuestring字符串类型值不可改变,但是可以切片,字符串可以使用+进行连接iota用来声明enum,表示自加1,初始为0var 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语言,但是break和continue可以跟标号,跳出多重循环。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用来定义inerfaceinterface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。
空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface
一个函数把interface{}作为参数,那么他可以接受任意类型的值作为参数,如果一个函数返回interface{},那么也就可以返回任意类型的值
value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型,如果ok为true则表示,element确实是T类型的。interface可以嵌套
并发
使用
go关键字+函数名实现并发使用
channel实现线程间通讯,channel通过make构造,使用<-来发送和接受数据。chan是channel的关键字,后面跟数据类型ch <- v发送数据,v:=<-ch接收数据,ch是chan类型。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语言语法汇总的更多相关文章
- Go语言语法汇总(转)
Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法 目录(?)[+] 最近看了看GoLang,把Go语言的语法 ...
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- R语言语法基础二
R语言语法基础二 重塑数据 增加行和列 # 创建向量 city = c("Tampa","Seattle","Hartford"," ...
- R语言语法基础一
R语言语法基础一 Hello world #这里是注释 myString = "hello world" print(myString) [1] "hello world ...
- L脚本语言语法手冊 0.10版
L脚本语言语法手冊 0.10版 简 介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- Go语言语法说明
Go语言语法说明 go语言中的go func(){}() 表示以并发的方式调用匿名函数func 深入讲解Go语言中函数new与make的使用和区别 前言 本文主要给大家介绍了Go语言中函数new与ma ...
- PL真有意思(二):程序设计语言语法
前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...
随机推荐
- Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统
-----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...
- java设计模式--行为型模式--中介者模式
怎么理解中介者模式,我姑且用房产中介来理解吧.呵呵 中介者模式: 中介者模式 概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之 ...
- Climbing Stairs 解答
Question You are climbing a stair case. It takes n steps to reach to the top. Each time you can eith ...
- base_local_planner vs. dwa_planner
http://answers.ros.org/question/10718/dwa_planner-vs-base_local_planner/ The dwa_local_planner suppo ...
- Unity扩展 自定义事件Send组件
在写项目的时候,我创建了一个方法里面需要一个int的参数. 我记得是UIEvent Trigger 不能直接传递一个数字,最多只能传递一个GameObject属性过去(=.=那个值不想再组件上定义) ...
- IOS 打印网络请求全链接
NSMutableString *urlStr = [NSMutableString stringWithFormat:@"%@?",request.URL]; ;i<[pa ...
- Segment(技巧 相乘转换成相加 + java)
Segment Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- kiki's game
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: ...
- mysql、sqlServer、hsql、oracle、db2各数据库支持的字段类型与最大精度
- git使用经验
一直想写一点关于git的文章,但是平时太懒了,没有写,现在写些经验这里,方便以后自己忘记了.