初探Go语言 | 青训营笔记

58 阅读2分钟

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

由于我之前的Python和Java的基础知识和经验,在学习Go语言时也感到得心应手。这也是Go语言一大特点,即快速上手。

从结构体开始记录:

结构体

Go 不是一门面向对象(OO)的语言,因此,Go 并没有类(Class)或是其他类似概念,取而代之的,是同类语言中均拥有的结构体(Struct)  。

结构体的命名格式: type 结构体名称 struct


type person struct {
   name string
   age  int
}

结构体的初始化格式:

p := person{name: "wang", age: 20}

结构体内部拥有变量和函数,如同java中的类成员函数。 类成员函数定义不能在结构体内,而是通过在func关键字后加上(变量名 结构体名)的方式来表示此函数是某个结构体的函数。

func (p person) getName() string {
   return p.name
}

同样的,如果想实现类似java中的set方法来更改原结构体中的属性,需要传入的是一个指针类型对象。

func (p *person) setName(name string) {
   p.name=name
}

可以通过new关键字得到结构体的指针,下面的例子中p_person保存的是Person结构体的地址。

var p_person = new(Person)

golang继承

golang本质上没有oop的概念,也没有继承的概念,但是可以通过结构体嵌套实现这个特性。

package main

import "fmt"

type Animal struct {
    name string
    age  int
}

func (a Animal) eat() {
    fmt.Println("eat...")
}

func (a Animal) sleep() {
    fmt.Println("sleep")
}

type Dog struct {
    Animal
}

type Cat struct {
    Animal
}

func main() {
    dog := Dog{
        Animal{
            name: "dog",
            age:  2,
        },
    }

    cat := Cat{
        Animal{name: "cat",
            age: 3},
    }

    dog.eat()
    dog.sleep()

    cat.eat()
    cat.sleep()

}

Go 错误处理

与 Java 不同,Go 语言并不支持 throwtry-catch 这样的操作,而是要在返回值列表中多加一个error类型的变量,通过条件判断,决定返回的error变量是否为nil,进而决定是否出现错误。此外需要提前导入error包。

func findUser(users []user, name string) (v *user, err error){
    for _,u := range users {
        if u.name == name {
            return &u, nil
        }
    }
    return nil, errors.New("not found")
}