10-Go语言的方法和接口
什么是go语言的方法
方法和函数类似,但是需要设置调用的者对象。和go语言的函数不同,方法可以针对调用对象不同重载。
子类重写“父类”中的方法
func main() {
w1 := Woker{
salary: 100,
doSomething: "mo yu",
}
w1.name="KB"
w1.do()
s2 := &Student2{
doSomething: "study",
}
s2.name="KB"
s2.do()
}
func (w Woker) do() {
fmt.Println(w.name, w.doSomething)
}
func (p Person2) do() {
fmt.Println(p.name, "什么都不干")
}
func (s *Student2) do() {
fmt.Println(s.name, s.doSomething)
}
type Woker struct {
Person2
salary int
doSomething string
}
type Student2 struct {
Person2
doSomething string
}
type Person2 struct {
name string
age int
}
接口
Go语言中,接口和类型的实现关系,是非侵入式的。类在实现接口时,不需要显式声明
1. 当需要接口类型的对象时,可以使用任意实现类型对象代替
2. 接口对象不能访问实现类中的属性
3. 空接口可以接受任意类型
4. map和切片的value可以设置匿名空接口,可以接受任意类型参数
func main() {
mouse := Mouse{name: "鼠标1"}
testInterface(mouse)
flashDisk := FlashDisk{name: "闪存"}
testInterface(flashDisk)
var usb USB
usb = mouse
testInterface(usb)
//usb.name 访问不了,
//usb.name
fmt.Println("================================")
test("123")
test(mouse)
test2(123)
test2(flashDisk)
fmt.Println("================================")
map1 := make(map[string]interface{})
map1["name"] = "GJ"
map1["age"] = 16
fmt.Println(map1)
slice1 := make([]interface{}, 0, 10)
slice1 = append(slice1, 123, "123", mouse, flashDisk)
fmt.Println(slice1)
}
func test(a A) {
fmt.Println(a)
}
func test2(a interface{}) {
fmt.Println(a)
}
type A interface {
}
type USB interface {
start()
end()
}
type Mouse struct {
name string
}
type FlashDisk struct {
name string
}
func (m Mouse) start() {
fmt.Println(m.name + "开始工作了")
}
func (m Mouse) end() {
fmt.Println(m.name + "结束工作了")
}
func (f FlashDisk) start() {
fmt.Println(f.name + "开始工作了")
}
func (f FlashDisk) end() {
fmt.Println(f.name + "结束工作了")
}
func testInterface(usb USB) {
usb.start()
usb.end()
}
实现Error接口
func main() {
a := -1
b := 10
area, err := getArea(a, b)
if err != nil {
if areaErr, ok := err.(*AreaError); ok {
fmt.Println(areaErr.errorMsg, a, b)
}
fmt.Println(err)
} else {
fmt.Println(area)
}
}
func getArea(a, b int) (int, error) {
if a < 0 || b < 0 {
err := AreaError{
a: a,
b: b,
}
err.Error()
return -1, &err
}
return a * b, nil
}
type AreaError struct {
a, b int
errorMsg string
}
func (area *AreaError) Error() string {
if area.a < 0 && area.b < 0 {
area.errorMsg = "长宽都不合法"
} else if area.a < 0 {
area.errorMsg = "长不合法"
} else if area.b < 0 {
area.errorMsg = "宽不合法"
} else {
area.errorMsg = "不知道咋回事"
}
return area.errorMsg
}