这是我参与「第五届青训营 」笔记创作活动的第17天.
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 //可以认为是继承
string
}
type Cat struct {
Animal //可以认为是继承
string
<img src="}" alt="" width="30%" />
func main() {
dog := Dog{
Animal{name: "huahua", age: 2},
"hello",
}
dog.eat()
dog.sleep()
fmt.Printf(dog.name)
fmt.Println(dog.age)
cat := Cat{
Animal{name: "kity", age: 3},
"hi",
}
cat.eat()
cat.sleep()
fmt.Printf(cat.name)
fmt.Println(cat.age)
}
golang构造函数:
golang没有构造函数的概念,可以使用函数来模拟构造函数的功能.
package main
import "fmt"
type Person struct {
name string
age int
}
func newPerson(name string, age int) (*Person, error) {
if name == "" {
return nil, fmt.Errorf("name 不能为空")
}
if age < 0 {
return nil, fmt.Errorf("age 不能小于0")
}
return &Person{name: name, age: age}, nil
}
func main() {
per, error := newPerson("tom", 12)
if error == nil {
fmt.Println(*per)
}
if per == nil {
fmt.Println(error)
}
}
golang包:
包可以区分命令空间(一个文件夹中不能有两个同名文件),也可以更好的管理项目.go中创建一个包,一般是创建一个文件夹,在该文件夹里面的go文件中,使用package关键字声明包名称,通常,文件夹名称和包名称相同.并且,同一个文件下面只能有一个包.
创建包:
package dao
import "fmt"
func Test1(){
fmt.Println("test1 package")
}
导入包:
要使用某个包下面的某个变量或方法,需要导入该包,导入包时,要导入从GOPATH开始的包路径,例如:
package main
import "dao"
func main(){
dao.Test1()
}
包注意事项:
- 一个文件夹下只能有一个package
import后面的其实是GOPATH开始的相对目录路径,包括最后一段。但由于一个目录下只能有一个 package,所以import一个路径就等于是import了这个路径下的包。
注意,这里指的是“直接包含”的go文件,如果有子目录,那么子目录的父母录是完全两个包。 - 比如你实现了一个计算器package,名叫calc,位于calc 目录下;但又想给别人一个使用范例,于是在 calc下可以建个example子目录(caic/example/),这个子目录里有个example. go(calc/example/example. go),此时,example. go可以是main包,里面还可以有个main函数。
- 一个package的文件不能在多个文件夹下
。如果多个文件夹下有重名的package,它们其实是彼此无关的package。
。如果一个go文件需要同时使用不同目录下的同名package,需要在import这些目录时为每个目录指 定一个package的别名。