一、简介
1.1 Go语言优势
Go语言优点众多
- 高性能、高并发
- 语法类似C语言,并且加以简化,学习周期更短
- 标准库极其丰富
- 工具链完善
- go语言是静态编译,只需要考虑编译后的一个可执行文件即可
- 编译速度快
- 跨平台,不仅支持Windows、mac、Linux,还可以用于ios、Android....
- 自带垃圾回收
二、入门
2.1 配置
vscode或者goland
2.2 基础语法
Hello World
package main // 文件属于哪个包
// 在 Go 语言中 main 包是一个特殊的包,代表你的 Go 语言项目是一个可运行的应用程序,而不是一个被其他项目引用的库。
import "fmt" // 导包
func main() { // 主函数
fmt.Println("Hello World")
}
三、数据类型
变量声明
有三种形式
// 变量声明:var 变量名 类型 = 值
var i int = 100
// Go可以自动类型推导,声明时不需要再写变量类型
var j = 99
// 简洁类型
m := 100
可以一次声明多个变量
// 可以一次声明多个变量
var (
k = 19
l = 12.678
)
数据类型
基础数据类型
- 整型: 有符号整型:如 int、int8、int16、int32 和 int64。 无符号整型:如 uint、uint8、uint16、uint32 和 uint64。
- 浮点数: float32 float64
- 布尔类型: bool
- 字符串: string
指针
和其他语言类似,只是作用很小。只用来改变函数传进来的参数的值。
p := &i,&用来取地址,*p 就等于 i
常量
定义
const name = "Changersh"
注意:go语言中,只允许布尔型、字符串、数字类型这些基础类型作为常量。
iota
常量生成器
用来初始化相似规则的常量,避免重复的初始化。
const(
one = 1
two = 2
three =3
four =4
)
// 和下面等价
const(
one = iota+1
two
three
four
)
字符串
互相转化
Go 语言是强类型的语言,也就是说不同类型的变量是无法相互使用和计算的。所以不同类型的变量在进行赋值或者计算前,需要先进行类型转换。
可以使用strconv包的函数,也可也强转
-
函数方法:
i := 100 i2s := strconv.Itoa(i) // int to string s2i, err := strconv.Atoi(i2s) // string to int
-
强转
i2f := float64(i) // int 强转 float64 f2i := int(i2f) // float64 强转 int,小数部分直接舍弃掉
Strings包
用于处理字符串的工具包,里面有很多常用的函数,帮助我们对字符串进行操作,比如查找字符串、去除字符串的空格、拆分字符串、判断字符串是否有某个前缀或者后缀等。
更多函数请自行查阅api
//判断s1的前缀是否是H
fmt.Println(strings.HasPrefix(s1,"H"))
//在s1中查找字符串o
fmt.Println(strings.Index(s1,"o"))
//把s1全部转为大写
fmt.Println(strings.ToUpper(s1))
四、控制结构
if-else if
注意:
- 条件判断不用小括号。
- 必须要加 {} ,哪怕只有一条语句
- if else 后面的 { 不能独占一行,否则编译不通过
- 可以将赋值语句和判断语句写在一起,二者用 分号 ; 隔开
if i:=6; i < 5{}
func main() {
i:=6
if i >10 {
} else if i>5 && i<=10 {
} else {
}
}
for
go语言循环语句只有 for 循环了。
- 基本语法: for i:=10; i <= 100; i++{}
- 但是以上三个部分都不是必须的,都可以省略
- go没有while循环,用 i:=10 提前声明变量,然后进行for循环 for i <= 100{},代替while
- 同样支持continue 和 break
switch
-
switch同样可以将赋值语句直接写在开头,后面同样要使用 分号; 隔开
-
switch中没有break语句,go语言会自带break
-
如下的
fallthrough,即使进入了第一个条件,有了这个语句之后,即使不满足后面的条件,但依然执行fallthrough后面的语句 所以fallthrough的作用就是,取消go语言自带的break效果,让后面的语句也可也被执行到 -
当 switch 之后有表达式时,case 后的值就要和这个表达式的结果类型相同,
比如:j:=10;j 或者 j 这种,
j就是表达式
// 最简单的情况,case表达式的值是任意的
switch i:=6;{
case i>10:
fmt.Println("i>10")
case i>5 && i<=10:
fmt.Println("5<i<=10")
default:
fmt.Println("i<=5")
}
// 复杂情况,switch后面有个 j,则case表达式的值必须和 j 是同一数据类型
// fallthrough:取消go自带的 break 效果
switch j:=1;j {
case 1:
fallthrough
case 2:
fmt.Println("1")
default:
fmt.Println("没有匹配")
}
-
而对于 switch 后省略表达式的情况,整个 switch 结构就和 if……else 条件语句等同了。
switch 后的表达式也没有太多限制,是一个合法的表达式即可,也不用一定要求是常量或者整数。