1 开发环境、基本语法
1.1 go语言开发包
下载地址:https://go.dev/dl/
进入官网选择对应的版本和系统下载并安装即可。
1.2 编辑器
GoLand:https://www.jetbrains.com/go/
1.2.1 新建项目
1.2.2 HelloWorld
通过以上步骤能够正确打印出hello world程序则表示go开发环境搭建成功。
1.2 Go基本语法
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
代码解析:
package main
:通过package关键字指定包名,在go文件中,必须要在代码一行指定当前文件属于哪个包名,包名可以自定义,但是一个go语言程序中必须有一个main包。import "fmt"
:导入fmt包,导入之后在该文件中即可使用fmt包中的函数,fmt包中主要有格式化IO输入输出函数。func main()
:main函数,一个go语言程序中必须包含一个main主函数,该函数是程序运行时执行的第一个函数(如果有init函数则第一个执行init函数)。fmt.Println("hello world")
:调用fmt包中的打印函数Println,该函数可将其中的字符串打印到控制台上,并且在打印完成之后换行。
2 数据类型
2.1 常见基本数据类型
- uint8:无符号8位整形,取值范围:0-255
- uint16:无符号16位整形,取值范围:0-65535
- uint32:无符号32位整形,取值范围:0-4294967295
- uint64:无符号64位整形,取值范围:0-18446744073709551615
- uint:32 或 64 位
- int8:有符号8位整形,取值范围:-128-127
- int16:有符号16位整形,取值范围:-32768-32767
- int32:有符号32位整形,取值范围:-2147483648-2147483647
- int64:有符号64位整形,取值范围:-9223372036854775808-9223372036854775807
- int:与uint一样大小
- byte:类似 uint8
- rune:类似 int32
- float32:32位浮点类型
- float64:64位浮点类型
- string:字符串
- bool:布尔类型,取值true或false
2.2 变量
Go 语言变量名由字母、数字、下划线组成,首字符不能为数字,不能使用关键字作为变量名。
Go语言中的25个关键字:
2.2.1 使用关键字var,并指定变量类型
// 声明单个变量
var 变量名 变量类型
// 声明多个变量
var 变量名1, 变量名2 变量类型
初始化变量
// 声明并初始化单个变量
var 变量名 变量类型 = 值
// 声明并初始化多个变量
var 变量名1, 变量名2 变量类型 = 值1, 值2
示例1,当只声明不初始化变量时,则输出默认值,int类型默认值为0,string默认值为""空字符串,bool类型默认false
package main
import "fmt"
func main() {
var s string
fmt.Println(s) // 输出
var a, b int
fmt.Println(a, b) // 输出0 0
}
示例2:声明并初始化变量
package main
import "fmt"
func main() {
var s string = "hello world"
fmt.Println(s) // 输出hello world
var a, b int = 1, 2
fmt.Println(a, b) // 输出1 2
}
2.2.2 使用关键字var,不指定类型
var 变量名 = 值
示例:
package main
import "fmt"
func main() {
var s = "hello world"
fmt.Println(s) // 输出hello world
var a, b = 1, 2
fmt.Println(a, b) // 输出1 2
}
2.2.3 使用:=
变量名 := 值
示例:
package main
import "fmt"
func main() {
s := "hello world"
fmt.Println(s) // 输出hello world
a, b := 1, 2
fmt.Println(a, b) // 输出1 2
}
使用该方法,如果某个变量在之前已经使用var的方式进行了声明,再使用:=
方式会出现编译错误,但是可以使用=
进行复制不会报错。
2.2.4 多变量声明
该方法声明变量多用于声明全局变量
var(
变量名1 变量类型 = 值1 // 同样可以不指定变量类型,使用 变量名 = 值 的形式,但是不能使用 :=
变量名2 变量类型 = 值2
)
示例:
package main
import "fmt"
var (
s string = "hello world"
a int = 1
b int = 2
)
func main() {
fmt.Println(s) // 输出hello world
fmt.Println(a, b) // 输出1 2
}
2.2.5 变量注意事项
- 在GO语言中,如果声明了一个变量,就必须使用,如果变量声明了但是不使用就会报错。
- 全局变量可以只声明不使用不会报错。
2.3 常量
常量就是不会改变的值,一般用于用于在程序运行期间不会被改变的值,常量和变量的声明类似,只是将var
关键字变成了const
。与变量不同的是,常量在声明的时候必须赋值。
2.3.1 使用const定义常量
示例:
package main
import "fmt"
// 多常量声明
const (
s = "hello world"
a = 1
)
func main() {
const PI = 3.1415 // 不指定常量类型
const E float32 = 2.7182 // 指定常量类型
fmt.Println(s) // 输出hello world
fmt.Println(a) // 输出1
fmt.Println(PI) // 输出3.14
fmt.Println(E) // 输出2.7182
}
2.3.2 iota
iota是Go语言中的常量计数器,只能在常量的表达式中使用,iota在const出现时被初始化为0,在const中每增加一个常量定义,则iota加1。
示例:
package main
import "fmt"
// 多常量声明
const (
a = 1 // iota = 0
b = 2 // iota = 1
c = iota // iota = 2
)
func main() {
const d = iota // iota = 0
fmt.Println(d) // 输出0
fmt.Println(c) // 输出2
}
3 运算符
3.1 算术运算符
假设a为3,b为2
运算符 | 描述 | 示例 |
---|---|---|
+ | 加法运算符 | a + b = 5 |
- | 减法运算符 | a - b = 1 |
* | 乘法运算符 | a * b = 6 |
/ | 除法运算符 | a / b = 1 |
% | 取余运算符 | a % b = 1 |
++ | 自增运算符 | a++ = 4 |
-- | 自减运算符 | b-- = 1 |
代码示例:
package main
import "fmt"
func main() {
a := 3
b := 2
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)
a++
b--
fmt.Println("a ++ = ", a)
fmt.Println("b -- = ", b)
}
运行结果:
3.2 关系运算符
假设a为3,b为2
运算符 | 描述 | 示例 |
---|---|---|
== | 判断两个值是否相等,如果相等返回true,否则返回false | a == b 为 false |
!= | 判断两个值是否不相等,如果不相等返回true 否则返回false | a != b 为 true |
> | 判断左边值是否大于右边值,如果是返回true 否则返回false | a > b 为 true |
< | 判断左边值是否小于右边值,如果是返回true 否则返回false | a < b 为 false |
>= | 判断左边值是否大于等于右边值,如果是返回true 否则返回false | a >= b 为 true |
<= | 判断左边值是否小于等于右边值,如果是返回true 否则返回false。 | a <= b 为 false |
代码示例:
package main
import "fmt"
func main() {
a := 3
b := 2
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("a <= b : ", a <= b)
}
运行结果:
3.3 逻辑运算符
假设a为true,b为false
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑与运算符,如果两边都为true,则为true,否则为false | a && b 为 false |
|| | 逻辑或运算符,如果两边有一边为true,则为true,否则为false | a || b 为 true |
! | 逻辑非运算符,如果为true,返回false,如果为false,返回true | !a 为 false, !b 为true |
代码示例:
package main
import "fmt"
func main() {
a := true
b := false
fmt.Println("a && b : ", a && b)
fmt.Println("a || b : ", a || b)
fmt.Println("!a : ", !a)
fmt.Println("!b : ", !b)
}
运行结果:
注意:逻辑运算符通常用于在if条件中做判断使用,并且逻辑运算符可以与关系运算符结合使用,例如 a > b && b > c
,当a 大于 b,并且b 大于 c 时则为true,否则为false。
3.4 位运算符
位运算符是对整数的二进制进行计算
假设a为3,b为2
则a转为二进制为:0011,b的二进制为:0010
a & b的计算方式步骤:
第一步:将a和b转为二进制
a = 0011 b = 0010
第二步:将转为二进制的两个数进行按位与运算
按位与运算规则:对应的两位数都为1则结果为1,计算结果如下
a: 0011
b: 0010
& ------
结果:0010
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符,将两边的整数作为二进制进行按位与运算,两位都为1则为1 | a & b = 2,二进制为0010 |
| | 按位或运算符,将两边的整数作为二进制进行按位或运算,两位其中一个为1,则为1 | a | b = 3,二进制为0011 |
^ | 异或运算符,将两边的整数作为二进制进行按位或运算,两位不相同则为1 | a ^ b = 1,二进制为0001 |
<< | 左移运算符,将左边的数转为二进制后向左位移右边指定的位数,左移n位就是乘以2的n次方 | a << 2 结果为12 ,二进制为 1100 |
>> | 右移运算符,将左边的数转为二进制后向右位移右边指定的位数,右移n位就是除以2的n次方 | a >> 2 结果为0 ,二进制为 0000 |
示例代码:
package main
import "fmt"
func main() {
a := 3
b := 2
fmt.Println("a & b = ", a & b)
fmt.Println("a | b = ", a | b)
fmt.Println("a ^ b = ", a ^ b)
fmt.Println("a << 2 = ", a << 2)
fmt.Println("a >> 2 = ", a >> 2)
}
运行结果:
3.5 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 赋值运算符,将右边表达式的值赋值给左边变量 | c = a + b => 表达式 a + b的结果赋值给变量c |
+= | 相加后再赋值 | a += b => a = a + b |
-= | 相减后再赋值 | a -= b => a = a - b |
*= | 相乘后再赋值 | a = b => a = a b |
/= | 相除后再赋值 | a /= b => a = a / b |
%= | 求余后再赋值 | a %= b => a = a % b |
<<= | 左移后赋值 | a <<= 2 => a = a << 2 |
>>= | 右移后赋值 | a >>= 2 => a = a >> 2 |
&= | 按位与后赋值 | a &= 2 => a = a & 2 |
^= | 按位异或后赋值 | a ^= 2 => a = a ^ 2 |
|= | 按位或后赋值 | a |= 2 = > a = a | 2 |
代码示例:
package main
import "fmt"
func main() {
a := 3
b := 2
var c int
c = a + b
fmt.Println("c = ", c)
a += b
fmt.Println("a = ", a)
a -= b
fmt.Println("a = ", a)
a *= b
fmt.Println("a = ", a)
a /= b
fmt.Println("a = ", a)
}
运行结果:
3.6 运算符优先级
由上到下代表优先级从高到低,相同优先级的运算符在计算的过程中按照从左往右依次计算,同时还可以临时使用小括号提高优先级。
优先级 | 运算符 |
---|---|
5 | * / % << >> & &^ |
4 | + - |
3 | == != < <= > >= |
2 | && |
1 | || |
代码示例:
package main
import "fmt"
func main() {
a := 20
b := 10
c := 15
d := 5
fmt.Println("(a + b) * c / d = ", ( a + b ) * c / d)
fmt.Println("((a + b) * c) / d = ", (( a + b) * c) / d)
fmt.Println("(a + b) * (c / d) = ", (a + b) * (c / d))
fmt.Println("a + (b * c) / d = ", a + (b * c) / d)
}
运行结果:
本文参与了SegmentFault 思否写作挑战赛活动,欢迎正在阅读的你也加入。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。