go基础语法 | 青训营笔记

376 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、本堂课重点内容:

  • go语言基础语法
  • go语言编程实例

二、详细知识点介绍:

  • 配置go语言环境和下载合适的IDE

  • 变量声明

    //a为int类型的默认值0
    var a int
    //初始化后直接赋值
    var b int = 1
    //推导类型
    var c = 2
    //等价于 var d = 3
    d := 3
    
  • 选择语句

    go语言支持ifelse ifelseswitch这些格式的选择语句,使用方式与java类似但if和switch后的判断语句或变量不使用括号;也可以直接省略 switch 后的变量而直接在case语句中写条件判断。 switch 的case语句在执行结束后会直接退出,不需要break语句

    t := time.Now()
    switch {
        case t.Hour() < 12:  //直接在case语句中进行条件判断
            fmt.Println("It's before noon")  //不需要break,结束直接跳出
        default:
            fmt.Println("It's after noon")
    }
    
  • 循环语句

    go语言中只有 for 语句,除了和java语言一样的三段表达式形式(判断语句照样没有小括号)的用法,还具备类似java的 while 关键字的用法,用法展示如下:

    //类似while(i<n) {...}
    i := 1
    for i <= 3 {
        //...
        i = i + 1
     }
     
     //类似while(true) {...}
     for {
         //...
     }
    
  • 数组和切片(slice)

    数组和java相同,长度固定、类型相同的一系列元素。因为长度无法改变在实际使用时一般使用slice。数组定义方法如下:

    //初始化一个长度为5的int数组(值默认都是0)
    var a [5]int
    // := 自动推导 和 初始化时直接赋值 (没赋值的部分值也是默认值)
    b := [5]int{1, 2, 3, 4}  //[1 2 3 4 0]
    

    slice切片是一种对数组的抽象,是Go语言的重要类型之一。切片的容量是可变的(可以类比java的ArrayList),在长度达到容量时再追加元素会自动扩容。声明slice可以直接按a := []int{1,2,3}格式,也可以通过make函数分配空间。对slice可以追加和截取,如果切片到达最大容量会自动扩容。

    //通过make函数分配空间,第二个参数是初始长度,第三个参数是实际容量(容量可省略,省略时初始容量和长度相同)
    a := make([]string, 0, 10)
    //追加元素,len+1,容量充足时容量不变;容量不够时会扩容
    a = append(a, "a", "b", "c", "d")
    //截取,和py有点像 [start, end]范围为索引[start, end); start和end可以省略,分别表示0和最后一位
    b := a[1, 4]  //["b" "c" "d"
    
  • map

    map用于存储键值对<key, value>,与java中的Map类似,可以对map进行遍历,但map不保留插入顺序。map声明方式如下:

    //通过make声明map[key_type]value_type
    a := make(map[string]string)
    //初始化时直接赋值
    b := map[string]string{"a" : 1, "b" : 2}
    

    map同样可以添加和删除其中的键值对; map添加和修改键值对的格式相同,都是a["one"] = "one"格式; map删除键值对使用delete()函数,格式为delete(a, "one")

  • 函数

    函数实例

    func add(a, b int) int {
        return a + b
    }
    

    go的函数支持多返回值,go的error一般就通过多返回值传递。

  • 指针

    指针是指向一个变量的地址的变量,因为go在传递参数都是值传递,操作的都是生成的副本,为了在函数中修改原值,需要使用到指针,通过传递变量的引用来实现对对象原地址空间的修改。示例如下:

    //使用指针完成数字交换
    func swap(a, b *int) {
        t := *a
        *a = *b
        *b = t
    }
    
    func main() {
        a, b := 1, 2
        swap(a,b)
    }
    
  • 结构体

    struct结构体,和C++类似,下面演示声明一个结构体的格式:

    type user struct {
        name string
        password string
    }
    

    结构体定义方法在普通函数的基础上指明了方法对应的结构体,想要在结构体的方法的内部对结构体中的属性进行修改也要使用指针。调用方法的格式和c++/java相同,变量名.方法()定义结构体方法的示例如下:

    func (u user) show() {
        fmt.Printf("%v\n", u)
    }
    
    //想要在方法内修改属性,要声明调用类型为指针
    func (u *user) SetName(name string) {
       u.name = name
    }
    
  • 还有其他知识点,如字符串操作、JSON处理、时间等

三、实践练习例子:

课程中通过三个例子演示go语言的使用。

第一个是一个经典的猜数字游戏,用到了随机数、控制台输入和for循环;

第二个是一个通过HTTP爬虫实现的在线词典;

第三个是一个简单的Socks5代理流程的实现

四、课后个人总结:

go语法和常用的java有一定区别,而且go是一个面向过程的语言,没有真正的面向对象思想的类的定义,只有结构体。在编码过程中有些许不适应,有些地方需要使用到指针,if等语句中的判断语句不使用括号等等。

五、引用参考:

juejin.cn/course/byte…