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 }