Go基础入门| 青训营笔记

99 阅读2分钟

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的快速高效,对于服务器的建立很方便,但有些语法还是不太习惯,之后继续加油。