开发环境搭建
go官网 https://golang.org/
下载 https://golang.org/dl/
下载 go1.11.2.windows-amd64.msi安装包,双击安装即可。
IDE工具
IntelliJ IDEA 安装go插件
File-Setting-Pluigns,检索go,点击install即可安装,安装成功后重启即可完成
新建Go项目
File-New-Project,选择Go,填写项目信息
填写项目名称,选择项目保存目录,点击Finish即可
新建Go File,选择File-New-Go File
完成简单的Hello world输出
/**包声明*/
package main
//引入包
import "fmt"
/**main函数定义*/
func main() {//go语法要求函数定义后紧跟的大括号必须跟在函数名后面,不能回车到下一行
/**定义变量name,并赋初值*/
var name string = "feiyue"
// fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n
fmt.Println("Hello world!","This is "+name)
}
//执行结果
Hello world! This is feiyue
程序编写完成后,直接点击main函数左侧绿色按钮运行即可
Go 语言的基本构成
包声明
package main
定义了包名。Go语言要求必须在源文件中非注释部分的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。引入包
import "fmt"
告诉 Go 编译器这个程序需要使用 fmt 包的函数,fmt 包实现了格式化 IO(输入/输出)的函数。函数
func main()
是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量的定义格式:const identifier [type] = value
显式类型定义:const b string = "abc"
隐式类型定义:const b = "abc"
变量
Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。
声明变量的一般形式是使用 var 关键字:
第一种,指定变量类型,声明后若不赋值,使用默认值。var name string
第二种,根据值自行判定变量类型。var name = "feiyue"
第三种,根据指定变量名称,变量类型,并赋值。var name string = "feiyue"
第四种,省略var, 使用:=
声明变量并赋值,注意:=
左侧的变量不应该是已经声明过的,否则会导致编译错误。d := 100
第五种:多变量声明,类型相同多个变量可以同时声明,然后一起赋值
var a, b int
var c string
a, b, c = 2, 3, "abc"
语句 & 表达式
Go 程序中,一行代表一个语句结束。每个语句不需要以分号 ; 结尾,这些工作都将由 Go 编译器自动完成。注释
/*...*/
是多行注释,在程序执行时将被忽略。单行注释是最常见的注释形式,可以在程序任何地方使用以//
开头的单行注释。多行注释也叫块注释,均已以/*
开头,并以*/
结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。标识符
标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z
和a~z
)数字(0~9
)、下划线_
组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。行分隔符
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号;
结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用;
人为区分,但在实际开发中并不鼓励这种做法。
Go 语言数据类型
在 Go 编程语言中,数据类型用于声明函数和变量。
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 类型 |
数字类型
整型:
序号 | 类型 | 描述 |
---|---|---|
1 | uint8 | 无符号 8 位整型 (0 到 255) |
2 | uint16 | 无符号 16 位整型 (0 到 65535) |
3 | uint32 | 无符号 32 位整型 (0 到 4294967295) |
4 | uint64 | 无符号 64 位整型 (0 到 18446744073709551615) |
5 | int8 | 有符号 8 位整型 (-128 到 127) |
6 | int16 | 有符号 16 位整型 (-32768 到 32767) |
7 | int32 | 有符号 32 位整型 (-2147483648 到 2147483647) |
8 | int64 | 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807) |
浮点型:
序号 | 类型 | 描述 |
---|---|---|
1 | float32 | IEEE-754 32位浮点型数 |
2 | float64 | IEEE-754 64位浮点型数 |
3 | complex64 | 32 位实数和虚数 |
4 | complex128 | 64 位实数和虚数 |
其他数字类型
序号 | 类型 | 描述 |
---|---|---|
1 | byte | 类似 uint8 |
2 | rune | 类似 int32 |
3 | uint | 32 或 64 位 |
4 | int | 与 uint 一样大小 |
5 | uintptr | 无符号整型,用于存放一个指针 |
Go 语言运算符
运算符用于在程序运行时执行数学或逻辑运算。
Go 语言内置的运算符有:
-
算术运算符
Go语言算术运算符包含以下7种,如下表所示:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | A + B 输出结果 30 |
- | 减 | A - B 输出结果 -10 |
* | 乘 | A * B 输出结果 200 |
/ | 除 | B / A 输出结果 2 |
% | 求余 | B % A 输出结果 0 |
++ | 自增 | A++ 输出结果 11 |
-- | 自减 | A-- 输出结果 9 |
代码示例
var a int = 36
var b int = 10
var c int
//加法
c = a + b
fmt.Printf("a + b = %d\n", c )
//减法
c = a - b
fmt.Printf("a - b = %d\n", c )
//乘法
c = a * b
fmt.Printf("a * b = %d\n", c )
//除法
c = a / b
fmt.Printf("a / b = %d\n", c )
//求余
c = a % b
fmt.Printf("a对b求余 = %d\n", c )
//自增
a = 20
a++
fmt.Printf("a++后 a 的值为 %d\n", a )
//自减
a = 20
a--
fmt.Printf("a--后 a 的值为 %d\n", a )
//执行结果
a + b = 46
a - b = 26
a * b = 360
a / b = 3
a对b求余 = 6
a++后 a 的值为 21
a--后 a 的值为 19
-
关系运算符
关系运算符分为以下6种
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 | (A == B) 为 False |
!= | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 | (A != B) 为 True |
> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | (A > B) 为 False |
< | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 | (A < B) 为 True |
>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 | (A >= B) 为 False |
<= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 | (A <= B) 为 True |
代码示例
var a int = 36
var b int = 20
// == 等于
fmt.Println("a == b ",a == b )
fmt.Println("a != b ",a != b )
// < 小于
fmt.Println("a < b ",a < b )
// > 大于
fmt.Println(" a > b ",a > b )
// <= 小于等于
fmt.Println("a <= b ",a <= b )
// >= 大于等于
fmt.Println("b >= a ",b >= a )
//执行结果
a == b false
a != b true
a < b false
a > b true
a <= b false
b >= a false
-
逻辑运算符
逻辑运算符有3种,分别是与(&&
)、或(||
)、非(!
)
运算符 | 描述 | 实例 |
---|---|---|
&& |
逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False |
|| |
逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A || B) 为 True |
! |
逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为 True |
代码示例
var a bool = true
var b bool = false
fmt.Println("a && b = ",a && b )
fmt.Println("a || b = ",a || b )
fmt.Println(" !a = " , !a)
//执行结果
a && b = false
a || b = true
!a = false
-
位运算符
位运算符对整数在内存中的二进制位进行操作,包括五个位运算符 按位与&
、按位或|
、按位异或^
、左移运算符<<
、右移运算符>>
Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:A = 0011 1100 B = 0000 1101
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A | B) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
按位与&
、按位或|
、按位异或^
的二进制运算表如下所示:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
-
赋值运算符
赋值运算符是算术运算、位运算基础上加上赋值=
结合而成的运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | C = A + B 将 A + B 表达式结果赋值给 C |
+= | 相加后再赋值 | C += A 等于 C = C + A |
-= | 相减后再赋值 | C -= A 等于 C = C - A |
*= | 相乘后再赋值 | C *= A 等于 C = C * A |
/= | 相除后再赋值 | C /= A 等于 C = C / A |
%= | 求余后再赋值 | C %= A 等于 C = C % A |
<<= | 左移后赋值 | C <<= 2 等于 C = C << 2 |
>>= | 右移后赋值 | C >>= 2 等于 C = C >> 2 |
&= | 按位与后赋值 | C &= 2 等于 C = C & 2 |
^= | 按位异或后赋值 | C ^= 2 等于 C = C ^ 2 |
|= | 按位或后赋值 | C |= 2 等于 C = C | 2 |
- 其他运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a; 将给出变量的实际地址。 |
* | 指针变量。 | *a; 是一个指针变量 |
运算符优先级
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
优先级 | 分类 | 描述 | 关联性 |
---|---|---|---|
1 | 后缀 |
() [] -> . ++ --
|
左到右 |
2 | 一元 |
+ - ! ~ ++ -- (type)*&sizeof
|
右到左 |
3 | 乘除、求余 |
* / %
|
左到右 |
4 | 加减 |
+ -
|
左到右 |
5 | 移位 |
<< >>
|
左到右 |
6 | 关系 |
< <= > >=
|
左到右 |
7 | 相等 |
== !=
|
左到右 |
8 | 按位与 | & |
左到右 |
9 | 按位异或 | ^ |
左到右 |
10 | 按位或 | | |
左到右 |
11 | 逻辑AND | && |
左到右 |
12 | 逻辑OR | || |
左到右 |
13 | 条件 | ?: |
右到左 |
14 | 赋值 |
= += -= *= /= %= >>= <<= &= ^= |=
|
右到左 |
15 | 逗号 | , |
左到右 |