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
}
posted @ 2022-11-14 17:23  花茶冰糖  阅读(28)  评论(0编辑  收藏  举报