Go语言学习笔记(一)
Go语言是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。语言特点简洁、快速、安全并行、有趣、开源内存管理、数组安全、编译迅速用途Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的编程语言。对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过...
Go语言是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
语言特点
简洁、快速、安全
并行、有趣、开源
内存管理、数组安全、编译迅速
用途
Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的编程语言。
对于高性能分布式系统领域而言,Go语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
除了OOP外,Go语言接收了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。
主要特性
自动垃圾回收
更丰富的内置类型
函数多返回值
错误处理
匿名函数和闭包
类型和接口
并发编程
反射
语言交互性
安装
ubuntu 系统 apt-get install golang,默认安装的是1.2.1,版本太低
go version 查看版本
安装新版1.14
方法一:
1. wget https://studygolang.com/dl/golang/go1.14.linux-amd64.tar.gz
2. tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz
3. vim /etc/profile中最后添加
export PATH=$PATH:/usr/local/go/bin
4.source /etc/profile 更新配置
方法二:
获取最新的软件包源,并添加至当前的apt库
sudo add-apt-repository ppa:longsleep/golang-backports
更新 apt库
sudo apt-get update
安装新版本
sudo apt-get install golang-go
语言结构
包声明
引入包
函数
变量
语句&表达式
注释
package main
import "fmt"
func main() {
/* 第一个程序 */
fmt.Println("Hello, World!")
}
1.第一行代码 package.main定义了包名。必须在源文件中非注释的第一行指明这个文件属于哪个包。package.main表示一个可以独立执行的程序,每个Go应用程序都包含一个名为main的包。
2.下一行 import "fmt" 告诉Go编译器这个程序需要使用fmt包(的函数,或其他元素),fmt包实现了格式化IO(输入/输出)的函数。
3.下一行 func main()是程序开始执行的函数,main函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有init()函数则会先执行该函数)。
4.下一行 /* */为多行注释, // 为单行注释。
5.fmt.Println()会在输出的最后加换行字符\n。fmt.Print("Hello,World!\n")可以得到相同的结果。
6.当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如Group1,那么使用这种形式的标识符的对象就可以被外部包的代码使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public);标识符如果以小写字母开头,则对外是不可见的,但是他们再整个包内部是可见并且可用的(像面向对象中的protected)。
运行
将代码保存为hello.go
执行 go run hello.go
还可以生成二进制文件 go build hello.go 执行 ./hello
注意 { 不能单独放在一行
Go标记
Go程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。
行分隔符
在Go程序中,一行代表一个语句结束。每个语句不需要像C家族中的其它语言一样以分号;结尾。因为这些工作将由Go编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用;认为区分,但实际中不鼓励这种做法。
标识符
标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或多个字母(A~Z和a~z)数字(0~9)、下划线组成的序列,但是第一个字符必须是字母或者下划线而不能是数字。也不能是Go语言的关键字如case
字符串连接
Go语言的字符串可以通过+实现。如 "Google" + "Runoob",得 "GoogleRunoob"
Go语言字符串用""双引号是常见方式,这种双引号不能跨行,如果想要在源代码中嵌入一个多行字符串时,就必须使用``反引号
关键字
下面列举了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 |
除了以上介绍的关键字,Go语言还有36个预定义标识符
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
Go语言数据类型
在Go编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要大数据的时候才需要申请大内存,就可以充分利用内存。
1 | 布尔型 布尔型的值只可以使常量true或者false,如 var b bool = true |
2 | 数字类型 整形int和浮点型float32,float64,Go语言支持整形和浮点型数字,并且支持复数,其中位的运算采用补码。 |
3 | 字符串类型 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。字符串数据只能用双引号。 |
4 | 派生类型 a.指针类型(Pointer) b.数组类型 c.结构化类型(struct) d.Channel类型 e.函数类型 f.切片类型 g.接口类型(interface) h.Map类型 |
Go语言的字符有以下两种
- 一种是uint8类型,或者叫byte型,代表了ASCII码的一个字符
- 另一种是rune类型,代表一个UTF-8字符,当需要处理中文等其他复合字符时,需要用到rune类型。rune类型等价于int32类型。
byte类型是uint8的别名,对于只用1个字节的传统ASCII编码的字符来说,完全没有问题,例如 var ch byte = 'A',字符也是用单引号括起来。在ASCII码表中,A的值时65,使用16进制表示为41,所以下面的写法是等效的
var ch byte = 65 或 var ch byte = '\x41' \x总是紧跟着长度为2的16进制数,另一种可能的写法是\377, \后面紧跟着长度为3的八进制数。
Go语言变量
变量来源于数字,是计算机语言中能存储计算结果或能表示值抽象概念。
变量可以通过变量名访问。
Go语言变量名由字母,数字,下划线组成,其中首个字符不能为数字。
变量声明 var identifier type
也可以一次声明多个变量 var identifier1,identifier2 type
例如: var a string = "Ruboob" var b, c int = 1, 2
变量声明
第一种,指定变量类型,如果没有初始化,则变量默认值为零值。
var b string 此时值为空字符串
var b int 此时b是0
var b bool 此时b为false
以下几种类型零值为nil
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error //error是接口
第二种,根据值自行判断变量类型。
var v_name = value 例如 var b = 1 var b = true
第三种,省略var, v_name := value 例如 b := 1 a,b := 1,2。 变量必须要声明 (var 或 :=),且一个变量在一个函数中只能声明一次。:= 这种不带声明格式的只能在函数中出现
多变量声明
//类型相同多个变量,非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断
vname1, vname2, vname3 := v1, v2, v3 //出现在 := 左侧的变量不能全是已经被声明过的,且只能在函数中使用
//这种因式分解关键字的写法一般用于声明全局变量
var (
vname1 v_type1
vname2 v_type2
)
实例
package main
var x,y int
var ( //一般用于声明全局变量
a int
b bool
)
var c, d int = 1,2
var e, f = 123, "hello"
func main(){
g,h := 123, "hello" //此种声明方式只能在函数中使用
println(x, y, a,b,c,d,e,f,g,h)
}
值类型和引用类型
所有像int,float,bool和string这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值
值类型当使用等号 = 将一个变量的值赋值给另一个变量时,如 j=i,实际上是内存中将i的值进行了拷贝;
通过 &i来获取i的内存地址。值类型的变量的值存储在栈中。
更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。
一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
引用类型当使用赋值语句 r2=r1时,只有引用(地址)被复制。如果r1的值被改变了,那么这个值的所有引用都会指向被修改的内容,在这个例子中r2也会受到影响。
变量注意事项
1.相同代码块中,相同名称变量不能重复声明
2.局部变量声明后,必须要使用,否则会报错。全局变量允许声明但不使用。
3. 互换两个变量的值,可以简单地使用 a, b = b, a 两个变量的类型必须是相同。
4.空白标识符 _ 。因为必须使用所有声明的局部变量,但有时并不需要使用某个变量,此时使用 _ 来接受多余的值。如
_, a = Func1() 空白标识符接收函数的第一个返回值,但不需要使用这个返回值。
Go语言常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型,数字型(整数型,浮点数和复数)和字符串型。
定义格式: const identifier [type] = value 可以省略类型说明符
多个简写为: const c_name1, c_name2 = value1, value2
常量还可以用作枚举
const (
Unknown = 0
Femail = 1
Male = 2
)
常量可以用len(), cap(), unsafe.Sizeof() 函数计算表达式的值,常量表达式中,函数必须是内置函数。
package main
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
iota 特殊常量
iota可以认为是一个可以被编译器修改的常量。iota在const关键字出现时将被重置为0(const内部的第一行之前),const中的行所以每新增一行常量声明将使iota计数一次(iota可以理解为const语句块中的行索引)。
const(
a = iota
b = iota
c = iota
)
//所以a=0, b=1, c=2,且可以简写如下:
const (
a = iota
b
c
)
用法
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值, 且iota += 1
e // "ha" iota += 1
f = 100 // iota += 1
g //100 iota += 1
h = iota //7
i //8
)
fmt.Println(a, b, c, d, e, f, g, h, i)
}
Go语言运算符
运算符用于在程序运行时执行数学或逻辑运算。内置运算符有:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符
算术运算符
+ | 相加 |
- | 相减 |
* | 相乘 |
/ | 相除 |
% | 求余 |
++ | 自增 |
-- | 自减 |
关系运算符
返回True,False
== | 是否相等 |
!= | 是否不等 |
> | 是否大于 |
< | 是否小于 |
>= | 是否大于等于 |
<= | 是否小于等于 |
逻辑运算符
返回true,false
&& | 逻辑AND运算 |
|| | 逻辑OR运算 |
! | 逻辑NOT运算 |
位运算符
位运算符对整数在内存中的二进制位进行操作, &,|,^, <<,>>
赋值运算符
包含 =, +=, -=, *=, /=, %=,<<=, >>=, &=,^=, |=
其他运算符
& 返回变量存储地址 例 &a
* 指针变量 例 var a=1; var ptr *int; ptr = &a
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)