这是我参与「第五届青训营 」伴学笔记创作活动的第 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 语言并不支持 throw,try-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")
}