这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
Go语言简介
概述
Go语言是由Google推出,原生支持多线程的一门现代编程语言,为高性能Web开发提供解决方案。
Go语言特点
原生支持多线程,因此是一门可以轻松实现高性能,高并发的语言。
作为一门现代语言,Go吸收了前人经验,拥有丰富的标准库和完整的工具链。
与C/C++相比,Go语言的语法简单,易上手。
Go的编译迅速,它是静态编译为一个独立的二进制可执行文件,并且可以交叉编译,具有跨平台的特性。
Go语言有垃圾回收机制,无需开发者手动释放内存,但也因此其性能与C/C++相比较弱。
Go入门开发
配置开发环境
从官网下载Go语言安装包,安装后使用VSCode或者Goland。
Goland基本上无需多余配置,安装后即可使用,下面讲一下Windows下VSCode的配置。
首先是插件的安装,搜索Go拓展,安装第一个即可。
后续是配置Go语言环境,首先检查系统的环境变量
设置GOPATH
Go语言编译器目录添加到系统变量的PATH
随后打开cmd,依次输入下面两条命令
go env -w GO111MODULE=on
go env -w GOPROXY=goproxy.cn
回到VSCode,即可安装Go的各种工具了。
Go语言语法
声明变量
//var 变量名 类型
var a int
var b string = "hello"//可以赋初值
//var 变量1,变量2 类型 = 值1,值2
var c, d float = 1.1,2.2
//变量名 := 初值,根据初值自动推断类型
e := 1 //int类型
f := "hello" //string类型
声明常量
与声明变量类似,把var改为const即可,注意 := 不能用于声明常量。
条件分支if语句
与C系列语言类似,但去掉了布尔表达式的括号。
a:=1
if a > 0 {
fmt.Println("Positive")
} else if a < 0 {
fmt.Println("Negtive")
} else {
fmt.Println("Zero")
}
循环
Go语言的循环只有for循环,没有while,但for同时做到了其它语言while的功能。
//无限循环
for {
fmt.Println(".")
}
//类似其它语言的for
for i:=0;i<100;i++ {
fmt.Println(i)
}
//类似其它语言的while
i:=100
for i>=0 {
fmt.Println(i)
i--
}
switch语句
Go语言的switch与C/C++不同,它无需在每个case结束后加上break,不会自动执行下面的case语句。 同时case的条件也可以很灵活,因此switch语句可以看作if语句的另一种形式
a := 2
switch a {
case 1:
fmt.Println("1")
case 2,3:
fmt.Println("2 or 3")
default:
fmt.Println("other")
}
switch {
case a > 0:
fmt.Println("Positive")
case a < 0:
fmt.Println("Negtive")
default:
fmt.Println("Zero")
}
其它常用数据类型
数组
var a[5] = int{1,2,3,4,5}
切片
可变长度数组
a := make([]int,5)
map
哈希表
m := make(map[string]int) //字符串为键,整形为值
使用 range 遍历容器
a := []int{1, 2, 3, 4}
for i, n := range a {
fmt.Println("Index:", i, "element:", n)
}
函数
func add(a int, b int) int {
return a + b
}
func add(a, b int) int {
return a + b
}
//多返回值
func add_sub(a int, b int) (int, int) {
return a + b,a - b
}
指针
作用类似于C/C++,但是用法简单得多,可以用来修改传入函数的参数的值。
a := 1
a_ptr := &a //取a的地址
//用指针可以实现交换两个变量值的函数
func swap(a *int, b *int) {
c := *b
*b = *a
*a = c
}
结构体和方法
Go语言的结构体实现了其他语言类的功能,结构体方法则实现了成员函数即方法的功能,Go语言就是这样实现面向对象的。
//定义结构体
type MyStruct struct {
a int
b string
}
//打印结构体成员的方法
func (s MyStruct) print {
fmt.Println(a, b)
}
//修改结构体成员的方法
func (s *MyStruct) set(a int,b string){
s.a = a
s.b = b
}
s := MyStruct{1, "hello"} //创建结构体变量
s.print() //调用打印方法
s.set(2, "bye") //调用修改方法
s.print() //打印修改结果
其他
课程后面讲的错误处理,字符串处理个人认为可以在项目制作过程中慢慢学习熟练,故不再提及。
项目实战
项目实战个人遇到了几点问题,分享出来希望对大家有帮助。
Windows下从命令行输入
在猜数字程序里,我从命令行输入整数总会导致Atoi函数返回错误,即输入的字符串不是整数,经过搜索引擎搜索,发现是Windows输入会在字符串末尾附加一个\r',则新增一行删去末尾'\r'的函数
input = strings.TrimSuffix(input, "\n")
input = strings.TrimSuffix(input, "\r")//这行加上就可以正常运行了
在线词典
要找到合适的翻译网址,HTTP请求简单的,比较容易实现。