该图来源于:知乎王炳明-怎么学习Goland?
个人感觉Go和C、python有点类似,本人已学习C、python,代码注释就没有特别详细。
网站汇总
官网(镜像):https://golang.google.cn/
Go语言中文网:https://studygolang.com/
Go语言入门教程:http://c.biancheng.net/golang/
GoLang教程_Go语言教程:https://www.bilibili.com/video/BV14T4y1g7h9?p=1
入门
// 单行注释。这是一个入门程序
package main
/* 这是多行注释
fmt 包实现了格式化 IO(输入/输出)的函数。
导入包必须使用双引号 " "
*/
import "fmt"
/*
main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数
如果有 init() 函数则会先执行该函数
*/
func main() {
/*
Print:输出函数
Println:自动换行输出
Printf:当需要输出变量时,使用这个输出
*/
fmt.Println("Hello, World!")
}
变量声明、赋值、初始化
// 变量的基础学习
package main
import "fmt"
func main() {
// 调用自创的函数
work1()
}
func work1() {
/*
定义变量。
格式:var 变量名称 变量类型
定义的变量必须要使用,没有设置默认值时,go默认是0
也可以使用‘冒号等于号 := ’定义变量,GO会根据所赋的值自动推导出变量的类型。如果给num变量赋值为小数,那么该变量的类型为小数类型(浮点)。
例: x := 100
*/
var x,week,day int
fmt.Print("请输入总天数:")
// 获取输入
fmt.Scanln(&x)
week = x/7
day = x%7
// 需要输出变量的时候,使用Printf函数输出
fmt.Printf("%d天 = %d周%d天",x,week,day)
}
数据类型
iota枚举
package main
import "fmt"
func main() {
/*
iota给常量赋值使用
iota常量自动生成器,每个一行,自动累加1
*/
const (
a = iota
b = iota
c = iota
)
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
// iota遇到const,重置为0
const d = iota
fmt.Printf("d = %d\n", d)
// 可以只写iota
const (
a1 = iota // 该值为0
b1
c1
)
fmt.Printf("a1 = %d, b1 = %d, c1 = %d\n", a1, b1, c1)
// 如果是同行变量,则值一样。也就是j1=j2=j3
const (
i = iota
j1, j2, j3 = iota, iota, iota
k = iota
)
fmt.Printf("i = %d, j1 = %d, j2 = %d, j3 = %d, k = %d\n", i, j1, j2, j3, k)
}
算术运算符
package main
import "fmt"
func main() {
var a int = 30
var b int = 10
var c int
fmt.Printf("a=%d,b=%d\n", a , b )
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++
fmt.Printf("a++ = %d\n", a )
a=30 // 为了方便测试,a 这里重新赋值为 30
a--
fmt.Printf("a-- = %d\n", a )
}
赋值运算符
关系运算符
流程控制
前面我们写的程序都是从第一行开始执行,一直执行到末尾,一行一行的顺序执行下来,这种执行结构叫顺序执行结构。
1、顺序结构:程序按顺序执行,不发生跳转。
2、选择结构:依据是否满足条件,有选择的执行相应功能。
3、循环结构:依据条件是否满足,循环多次执行某段代码。
if-else结构
package main
import "fmt"
func main() {
fmt.Println("让用户输入用户名和密码,如果用户名为admin,密码为mypass,则提示登录成功")
var name string
var pwd string
fmt.Print("请输入用户名:")
fmt.Scanf("%s\n",&name)
fmt.Print("请输入密码:")
fmt.Scanf("%s",&pwd)
if name == "admin" && pwd =="mypass"{
fmt.Println("登陆成功!!")
}else {
fmt.Println("账号或密码错误")
}
}
循环结构
package main
import "fmt"
func main() {
var sum int
for i :=1; i<=100 ; i++{
sum+=i
}
fmt.Println("累加的和=",sum)
}
函数
package main
import "fmt"
/*
写一个Ticket类,有一个距离属性,
不能为负数,有一个价格属性,
并且根据距离distance计算价格Price (1元/公里):
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
*/
type Ticket struct {
distance float64 //表示距离
price float64 //表示价格
}
func (p *Ticket) GetValue (price float64, distance float64) {
if distance < 0 {
distance = 0
}
p.distance = distance
p.price = price;
if p.distance > 0 && p.distance <= 100 {
p.price = p.price * 1.0
} else if p.price >= 101 && p.price < 200 {
p.price = p.price * 0.95
} else if p.price >= 201 && p.price < 300 {
p.price = p.price * 0.9
} else {
p.price = p.price * 0.8
fmt.Println(p.price)
}
}
func main(){
var ticket Ticket
ticket.GetValue(190,200)
}
Go正则表达式
package main
import "fmt"
// 正则所需的包
import "regexp"
func main() {
buf := "abc azs a8c 888 a9c tac"
// 1、解释规则,它会解析正则表达式,如果成功,返回解释器
// reg1:=regexp.MustCompile(`a.c`)//··用于原生字符串
// reg2:=regexp.MustCompile(`a[0-9]c`)
reg1 := regexp.MustCompile(`a\dc`)
if reg1 == nil {
fmt.Println("regexp err")
return
}
// 2、根据规则提取关键信息
result1 := reg1.FindAllStringSubmatch(buf, -1)
fmt.Println("result1=", result1)
}
Go的异常处理
生成错误信息有两种格式
Err1 := fmt.Errorf(“%s”,”this is an error1”)
Err2:=errors.New(“this is an error2”)
然后我们打印即可
fmt.Println(Err1,Err2)
函数panic(interface{})
// 其中参数可以是任意类型
用于打印系统级别的错误(比如数组下标越界),如果直接调用panic()函数,那么程序会崩溃
函数recover() 的作用是恢复
即不想让程序崩溃来恢复一下,直接执行 recover()会让程序略过错误信息,继续执行