go语言

golang介绍

心已入冬 提交于 2020-03-20 10:15:23
一、golang介绍 golang 是Google开发的一种 静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。 二、语言特性 1.、自动垃圾回收 2、支持函数多返回值 3、并发强 三、golang程序基本语法 1、所有go源码以.go结尾 2、go程序执行入口是main()函数 3、go语言严格区分大小写 4、go语言编译时是一行一行编译的,所以代码一行不能写入多条的语句 5、go语言定义的变量和import的包,如果没有使用,就会报错 四、GO语言特殊字符 1、\t   指标符(tab建) 2、\n   换行符 3、\    取消符号转义,(类似shell的\) 4、\r   回车键 五、GO语言注释 1、//   单行注释 2、/**/    多行注释(/*注释内容*/) 六、Go语言代码规范 1、 缩进标准为一个tab的长度 2、运算符以一个空格隔开(var x = a + b) 3、go语言写法只能 func add(){ //大括号在这 } 不允许如下 func add() { //大括号在这 } 4、保留关键字 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type

Go语言入门(四)Map&函数

只愿长相守 提交于 2020-03-17 21:29:20
map&函数 map类型 map的申明和定义 map是一个key-value的数据结构,是引用类型的数据结构,需要初始化 初始化的时候容量可以定义,也可以不定义 map必须初始化才能使用,否则会panic var a map[key的类型]value的类型 func defineMap() { var user map[string]int = make(map[string]int) user["abc"] = 38 fmt.Printf("user:%v\n",user) a := make(map[string]int) a["jack"] = 1001 a["handsome"] = 1002 a["shark"] = 1003 //根据key获取value fmt.Printf("a[jack]=%v\n",a["jack"]) } Map的使用 判定map的长度使用len 如何判定map指定的key是否存在: value,ok := map[key] # 用户角色判定 var whiteUser map[int]bool = map[int]bool { 34123: true, 3456334: true, 1:true, } func isWhiteUser(UserId int) bool { _,ok := whiteUser[UserId] return ok

Go语言格式化输入

邮差的信 提交于 2020-03-17 07:29:35
格式化输入 定义: 这里的格式化输入主要是指通过终端输入,这里介绍三个 fmt 包中的三个终端输入函数。 fmt.Scanf() fmt.Scan() fmt.Scanln() 语法: fmt.Scanf() 以格式化的形式读取终端输入的内容 func testScanf ( ) { var a int var b string // 这里是以空格作为分隔符,除了占位符外,其它的字符我们在终端输入的时候要原样输入 fmt . Scanf ( "%d %s" , & a , & b ) fmt . Println ( a , b ) } fmt.Scan() 从终端读取多个变量,以空格或换行符作为分隔符 func testScan ( ) { var ( a int b bool ) // 这里在终端输入一个整数后,输入空格或者回车就可以继续输入第二个变量,然后按回车就会输入 a b 变量 fmt . Scan ( & a , & b ) fmt . Println ( a ) fmt . Println ( b ) } fmt.Scanln() 从终端读取多个变量,以空格作为分隔符 func testScanln() { var ( a, b string c int d float32 ) // 从终端输入一个变量后输入空格再次输入第二个变量依此输入其它变量 fmt.Scanln

go语言之Goroutines

时间秒杀一切 提交于 2020-03-16 17:55:15
说明 计算机每开启一个程序,都会开启一个进程,而每一个进程当中也同样会包含很多的子任务,这些任务会通过线程来分化完成,但是线程在切换的时候存在上下文切换消耗,这个时候就轮到协程登场了。 首先,我们要知道的是,协程是属于线程的,也就是说协程是在线程中跑的,因此协程用被称为微线程。因为协程需要手动切换所以更加的灵活被称为用户线程空间。 而在go中,天生就带有了goroutine,能够帮助我们完成并发操作,这也是go能够流行的原因。 Goroutines 是在 Golang 中执行并发任务的方式。它们仅存在于 Go 运行时的虚拟空间中而不存在于 OS 中,因此需要 Go 调度器来管理它们的生命周期。请记住这一点很重要,对于所有操作系统看到的都只有一个请求并运行多个线程的单个用户级进程。goroutine 本身由 GoRuntimeScheduler 管理。 关于goroutine的详细原理,可以去读一下go语言实战。 使用 在Go语言中,每一个并发的执行单元叫作一个goroutine。设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系。一个线性的程序会先调用其中的一个函数,然后再调用另一个。如果程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。马上就会看到这样的一个程序。 当一个程序启动时

go语言有哪些优势

主宰稳场 提交于 2020-03-16 08:15:14
1、学习曲线容易 Go语言语法简单,包含了类C语法。因为Go语言容易学习,所以一个普通的大学生花几个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。 Go 语言的语法特性简直是太简单了,简单到你几乎玩不出什么花招,直来直去的,学习曲线很低,上手非常快。 2、效率:快速的编译时间,开发效率和运行效率高 开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。 C 语言的理念是信任程序员,保持语言的小巧,不屏蔽底层且底层友好,关注语言的执行效率和性能。而 Python 的姿态是用尽量少的代码完成尽量多的事。于是我能够感觉到,Go 语言想要把 C 和 Python 统一起来,这是多棒的一件事啊。 3、出身名门、血统纯正 之所以说Go出身名门,从Go语言的创造者就可见端倪,Go语言绝对血统纯正。其次Go语言出自Google公司,Google在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。 4、自由高效:组合的思想、无侵入式的接口

Go语言开发基础环境搭建

那年仲夏 提交于 2020-03-16 01:10:15
1、安装Go开发包 下载地址:< https://golang.google.cn/dl/&gt ; 下载适合自己的版本进行安装即可。 安装完成后,可以用以下命令进行查看: 2、配置GOPATH 步骤: 在自己电脑上新建一个目录 E:\DEV\Go 做为Go代码存放目录 将上面创建的目录添加到我们的环境变量中 在上面的目录中新建三个文件夹,分别是 bin src pkg 将 E:/DEV/Go/bin 添加到PATH环境变量中 3、开发目录架构 1.14版本之前: 4、HelloWorld 代码如下:main.go package main import "fmt" func main(){ fmt.Println("Hello World") } 编译: 1、在项目目录下执行 go build 2、在其他目录执行 go build 需要在后面加上项目路径,路径从项目src目录后面写 3、指定输出文件 go build -o filename 5、命令介绍 5.1、go build 打包使用。 5.2、go run 执行允许go文件 go run main.go 5.3、go install 这个命令的作用分两步: 使用go build命令进行编译; 将编译好的二进制文件拷贝到我们的 GOPATH/bin 目录下 6、跨平台编译 (1)

Go语言中复合的数据类型

半世苍凉 提交于 2020-03-16 00:37:54
数组 数组是同一种数据类型元素的集合。在Go语言中,数组从声明时就确定,可以对其成员进行修改,但是不可以修改数组的大小。 数组的定义 数组的基本定义语法如下: var 数组名 [数组大小]类型 比如定义一个长度为3,类型是int的数组: var a [3]int 注意:长度必须是常量,它是数组类型的一部分,一旦定义,长度不能改变。 数组的初始化 (1)、初始化数组时可以使用初始化列表来设置数组元素的值。 func main() { var testArray [3]int //数组会初始化为int类型的零值 var numArray = [3]int{1, 2} //使用指定的初始值完成初始化 var cityArray = [3]string{"北京", "上海", "深圳"} //使用指定的初始值完成初始化 fmt.Println(testArray) //[0 0 0] fmt.Println(numArray) //[1 2 0] fmt.Println(cityArray) //[北京 上海 深圳] } (2)、按照上面的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度,例如: func main() { var testArray [3]int var numArray = [...]int{1, 2} var

Go语言常量与变量初识

大兔子大兔子 提交于 2020-03-16 00:25:38
标识符和关键字 标识符 标识符只能以字母和 _ 组成,并且只能以字母和 _ 开头。 关键字 Go中有25个关键字: break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var 变量 变量声明 变量需要先声明,再使用。其语法如下: var name string 其数据类型有: string,字符串 int,整型 bool,布尔型 上面这种是一个变量一个变量的声明,go也有批量声明方式: var ( name string age int isBoy bool ) 变量的初始化: func main(){ name = "joker" age = 18 isBoy = true } 注意: Go语言中非全局变量声明了必须使用,不使用则编译不过去。 变量还可以声明的同时并赋值: var name string = "Joker" 也可以根据值来判断变量是什么类型: var age = 14 还可以用简短变量声明(只能在函数体里使用): name := "Joker" fmt.Print(name) 匿名变量 匿名变量不占用命名空间

Go语言中基本数据类型初识

孤街醉人 提交于 2020-03-16 00:24:31
在Go语言中常用的基本数据类型有如下几种: 整型 浮点型 布尔类型 复数 字符串 整型 有符号 int8 int16 int32 int64 无符号 uint8 uint16 uint32 uint64 特殊整型 uint,32位操作系统就是uint32,64位操作系统就是uint64 int,32位操作系统就是int32,64位操作系统就是int64 uintptr,无符号整型,用于存放指针 注意:在使用 int 和 uint 类型时,不能假定它是32位或64位的整型,而是考虑 int 和 uint 可能在不同平台上的差异。 进制 // 程序入口 func main() { // age = "17" // fmt.Println("Hello World") // fmt.Print("isOK") // fmt.Printf("Age: %s", age)\n var a1 = 10 fmt.Printf("十进制:%d\n", a1) fmt.Printf("二进制:%b\n", a1) fmt.Printf("八进制:%o\n", a1) fmt.Printf("十六进制:%x\n", a1) // 直接定义八进制 a2 := 077 fmt.Printf("直接声明八进制:%d\n", a2) // 直接定义十六进制 a3 := 0x12321 fmt.Printf(

Go语言入门(三)数组和切片

一笑奈何 提交于 2020-03-15 08:04:01
数组和切片 数组 定义:同一类型的元素集合 var a[3]int //定义一个数组,数组的下标是从0开始,长度为n的数组下标的有效范围是0到n-1 func arraySet() { var a[6] int a[0] = 1 a[1] = 2 fmt.Printf("array is %v\n",a) var b[3]int = [3]int{1,2,3} fmt.Println(b) c := [...]int{1,3,4} fmt.Println(c) d := [3]int{10} fmt.Println(d) e := [3]int{2:10} // 下标为2的值设置为10 fmt.Println(e) } 数组要保持类型一致,长度一致,这样才能做等值的赋值 数组遍历 func loopArray() { a := [...]int{1,2,3,4,5,6,7,8,9,10} for index,val := range a { fmt.Printf("index:%d\tvalue:%d\n",index,val) } b := [6]string{"a","b","c","d","e","f"} for i:=0;i<len(b);i++ { fmt.Printf("index:%d\tvalue:%s\n",i,b[i]) } } 二维数组与遍历 func