Go语言入门经典:方法 接口 习题

1.使用方法有何优点?

答:使用方法可以直接调用所声明的接收者的数据类型,例如结构体。

2.可将方法与切片相关联吗?

答:可以,方法可以与任何数据类型相关联。

3.多态是什么意思?

答:多态是指多种不同的形态,接口支持多态的实现。

4.为出租车编写一个接口。您可在其中包含任何方法,但需要考虑一些因素,如出租车是否为空、有多少乘客及出租车是否停运。

// taxi interface achievement

package main

import "fmt"

type Taxi struct {
	Full bool
}

type Transport interface {
	Empty()
	Passengers()
	Ok()
}

func (t Taxi) Empty() {
	if t.Full {
		fmt.Println("不是空车!")
	} else {
		fmt.Println("是空车!")
	}
}

func (d Taxi) Passengers() {
	if d.Full {
		fmt.Println("车上有乘客,乘客有三人!")
	} else {
		fmt.Println("没人!")
	}
}

func (c Taxi) Ok() {
	if c.Full {
		fmt.Println("运载中!")
	} else {
		fmt.Println("可以打!")
	}
}

func main() {
	var m Transport

	m = Taxi{
		Full: true,
	}
	m.Empty()
	m.Passengers()
	m.Ok()

	var n Transport

	fmt.Println(" ")

	n = Taxi{
		Full: false,
	}
	n.Empty()
	n.Passengers()
	n.Ok()
}

5.扩展接口Robot,在其中添加方法Talk,让两个结构体都实现方法Talk。

package main

import (
	"errors"
	"fmt"
)

type Robot interface {
	Poweron() error
	Talk()
}

type T850 struct {
	Name string
}

type R2D2 struct {
	Broken bool
}

func (a *T850) Talk() {
	fmt.Println("你瞅啥?")
}

func (r *R2D2) Talk() {
	fmt.Println("瞅你咋地!")
}

func (a *T850) Poweron() error { //使用接口后,就可以有多个相同的方法名
	return nil
}

func (r *R2D2) Poweron() error {
	if r.Broken {
		return errors.New("R2D2 is broken")
	} else {
		return nil
	}
}

func Boot(r Robot) error {
	return r.Poweron()
}

func main() {
	t := T850{
		Name: "The Terminator",
	}

	r := R2D2{
		Broken: true,
	}

	err := Boot(&r)

	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("Robot is powered on!")
	}

	err = Boot(&t)

	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("Robot is powered on!")
	}

	var m Robot
	m = &T850{}
	var n Robot
	n = &R2D2{}

	m.Talk()
	n.Talk()
}

6.阅读errors包的源代码,您明白了方法是如何与结构体相关联吗?

// Copyright 2011 The Go Authors.  All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	// Package errors implements functions to manipulate errors.
     6	
     7	// error 包实现了用于错误处理的函数.
     8	package errors
     9	
    10	// New returns an error that formats as the given text.
    11	
    12	// New 返回一个按给定文本格式化的错误。
    13	func New(text string) error {
    14		return &errorString{text}
    15	}
    16	
    17	// errorString is a trivial implementation of error.
    18	
    19	// errorString 是 error 的一个琐碎的实现。
    20	type errorString struct {
    21		s string
    22	}
    23	
    24	func (e *errorString) Error() string {
    25		return e.s
    26	}

猜你喜欢

转载自blog.csdn.net/fengqy1996/article/details/124329996
今日推荐