转--Golang语言语法汇总
时间:2022-05-05
本文章向大家介绍转--Golang语言语法汇总,主要内容包括数据类型、流程控制、函数、Struct类型、interface接口、并发、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
最近看了看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 = 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,%dn",x); }else{ fmt.Print("x >= 10 ,%dn",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
用来定义inerface
- interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。
- 空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核数
- 破解之美:利用ECB加密缺陷突破cookie加密
- 让Python猜猜你是否能约会成功
- python学习笔记之初识Python
- 从APK解密到批量获取他人信息
- React native和原生之间的通信
- 移动云存储服务平台Parse下的iOS安全分析
- 经典算法学习之回溯法
- 渗透测试系统BackBox Linux 4.1发布
- CMS漏洞检测工具 - CMSmap
- 基因组分析中多物种同源基因的鉴定和筛选
- SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析
- Intellij IDEA 插件开发之自建插件仓库
- 空Word文档附件:绕过垃圾邮件过滤的新方法
- SpringMVC基本使用关于DisptacherServlet关于ServletContainerInitializer最简单配置接收参数路径变量表单变量
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 为什么要用TypeScript
- np.clip截取函数
- 常见编程模式之双指针
- python操作txt文件中数据教程[2]-python提取txt文件中的行列元素
- JSON 是什么?它能带来什么?它和 XML 比较?
- 一起来学演化计算-实数空间变异算子
- 卡特兰数入门
- 常见编程模式之动态规划:0-1背包问题
- stat 命令家族(2)- 详解 pidstat
- MTO和MaTO MMZDT
- stat 命令家族(3)- 详解 mpstat
- 知识图谱入门(一)
- PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
- stat 命令家族(4)- 详解 iostat
- PHP将数组存入数据库中的四种方式