这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,本节课主要介绍了Go语言的一些基础语法,并且用三个实战小项目让我们可以更快的上手Go语言。
课堂内容
1. Go基础语法
在加入青训营之前,我对Go一直都是有所听闻但从未使用过,学习一门语言,总是从Hello,world开始。使用Go语言输出Hello,world的代码如下:
package main
import "fmt"
func main(){
fmt.Println("Hello,world")
}
看到这段代码的第一眼,我脑海中闪过的第一个念头是:这不就是Java?但随着老师的深入介绍,我才意识到Go语言的语法有着自己独特的风格。除了每种语言都有的属于自己的标准库、工具库等内容,Go语言让我眼前一亮的地方有以下几点:
a. 参数类型后置/返回值后置
使用Go语言声明一个变量或者函数的写法如下
var name type //var 为Go语言声明变量的关键字,name为变量名,type为变量类型
func funcName(name1 type1,name2 type2...)(ret1 type3,ret2 type4){}
//name1/name2为形参名,type1/type2为形参类型,ret1/ret2为返回值名,type3/type4为返回值类型
可以注意到,Go语言中,无论是参数类型或者返回值的位置,都是放在末尾的位置,这与之前学习C/C++、java时的书写方式完全不一样。
b.变量声明方式
Go语言声明变量有以下几种方式:
正常格式:
var name type
//exp:var num int = 10
批量格式:
var (
a int
b float32
c string
)
简短格式:
name := expression
//exp: num := 10
其中需要注意 = 和 := 的区别,在Go中,:= 用于声明和赋值,而 = 仅用于赋值
c.支持多个返回值
ret1, ret2 := func()
Go语言使用以上方法来接收一个函数的多个返回值,这在C/C++或Java上需要额外定义结构体来实现
d.多个不同类型的变量一起赋值
Go语言支持使用以下方式对变量赋值
intNum, str, floatNum := 10, "10", 10.0
以上是我在Go语言语法学习中印象较深的几点。
2.实战项目
老师在之后带我们写了三个小项目,分别是a.猜数字游戏、b.词典、c.socks5代理。通过三个简单的小项目让我们了解了Go语言的I/O、如何作为客户端发送请求和解析响应报文、作为代理服务端如何接收请求、转发请求、接收响应、转发响应等。通过三个小项目的学习,也对Go语言有了一个更深刻的认识。
3.遇到问题
老师在课后布置了三个作业,第一个作业是: 修改猜数字游戏里的代码,使用fmt.Scanf来简化代码
原始的接受输入的代码为:
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
word := strings.Trim(input, "\r\n")
我在简单查看了fmt.Scanf()函数的介绍后,将代码改成了如下形式:
var num int
_, err = fmt.Scanf("%d",&num)
if err != nil {
log.Printf("%v",err)
}
运行代码后发现程序开始运行后,每输入一个数后按回车,总会输出一个为 unexpected newline的错误,查阅资料后发现,Scanf会把回车当成下一次的输入,因此在使用Scanf时,需要额外对行末的回车进行处理,使用fmt.Scanln()来接收回车,修改代码后变成:
var num int
_, _ = fmt.Scanf("%d",&num) // 接收数字
_, _ = fmt.Scanln() // 接收回车符
在查阅资料过程中,也学到了fmt.Scanf()/fmt.Scan()/fmt.Scanln()几种输入函数的用法以及可能会遇到的一些坑,在此记录一下:Scanf()/Scan()/Scanln()的用法与坑
4.总结
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言比大多数其它语言有着更高的开发效率。这次有幸可以参加字节跳动青训营的后端进阶班,希望可以在青训营里学到更多用Go做后端开发的知识。