Go基础入门| 青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
学习内容
今天学习了go语言的入门课程,第一节课学习了go语言的基础语法,感觉go语言和python、java、c都有相似的地方,当然也有自己的特点,令我印象深刻的有几个知识点,在这里记录下来。
基础语法
编译环节
类似C语言,go也是用分号来终止语句,但是这些分号不会出现在源中,在词法分析器使用简单的规则自动插入分号,但是有一种情况需要注意
if i<f(){
g()
}
如果下列写法,有可能会将分号插入到if后面
if i<f()
{
g()
}
循环语句
go语言的循环语句只有for来实现
//像C for
for init;condition;post{}//三个可以任意去掉
//像C while
for condition{}
//像C for(;;)
for{}
switch
switch应用更加便捷和自由,表达式不用是常量甚至整数
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+', '%':
return true
}
return false
}
\\类型
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T\n", t)
case bool:
fmt.Printf("boolean %t\n", t)
case int:
fmt.Printf("integer %d\n", t)
case *bool:
fmt.Printf("pointer to boolean %t\n", *t)
case *int:
fmt.Printf("pointer to integer %d\n", *t)
}
defer
这是我第一次使用延迟函数,觉得很有意思
defer可以保证不会忘记关闭文件,代码更清晰。
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i) \\4,3,2,1,0
}
\\先求引用的函数值,再defer
func trace(s string) string {
fmt.Println("entering:", s)
return s
}
func un(s string) {
fmt.Println("leaving:", s)
}
func a() {
defer un(trace("a"))
fmt.Println("in a")
}
func b() {
defer un(trace("b"))
fmt.Println("in b")
a()
}
func main() {
b()
}
entering: b
in b
entering: a
in a
leaving: a
leaving: b
切片
与python不同,不可以负数索引
make([]int, 10, 100)
数组
与c语言不同
- 数组是value,将一个数组分配给另一个数组会复制所有元素。
- 如果您将数组传递给函数,则 将接收数组的副本,而不是指向它的指针。
- 数组的大小是其类型的一部分。
[10]int不能传给[20]int
实践部分
- 猜数小游戏: rand类需要给随机种子,否则输出相同的结果
- 词典 发送请求获取数据流
json.Marshall和`json.Unmarshal' - Socket5 理解的不够深入,感觉更多是在建立连接,发送报文
感受
这是第一次接触go语言,感觉go语言兼顾了python的便捷和c的快速高效,对于服务器的建立很方便,但有些语法还是不太习惯,之后继续加油。