Methods and Interfaces Part3

2023-10-22 18:45
文章标签 methods part3 interfaces

本文主要是介绍Methods and Interfaces Part3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Stringers

One of the most ubiquitous interfaces is Stringer defined by the fmt package.

type Stringer interface {String() string
}

A Stringer is a type that can describe itself as a string. The fmt package (and many others) look for this interface to print values.

package mainimport "fmt"type Person struct {Name stringAge  int
}func (p Person) String() string {return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}func main() {a := Person{"Arthur Dent", 42}z := Person{"Zaphod Beeblebrox", 9001}fmt.Println(a, z)
}

2.Exercise: Stringers

Make the IPAddr type implement fmt.Stringer to print the address as a dotted quad.

For instance, IPAddr{1, 2, 3, 4} should print as "1.2.3.4".

package mainimport "fmt"type IPAddr [4]byte// TODO: Add a "String() string" method to IPAddr.func main() {hosts := map[string]IPAddr{"loopback":  {127, 0, 0, 1},"googleDNS": {8, 8, 8, 8},}for name, ip := range hosts {fmt.Printf("%v: %v\n", name, ip)}
}

3.Errors

Go programs express error state with error values.

The error type is a built-in interface similar to fmt.Stringer:

type error interface {Error() string
}

(As with fmt.Stringer, the fmt package looks for the error interface when printing values.)

Functions often return an error value, and calling code should handle errors by testing whether the error equals nil.

i, err := strconv.Atoi("42")
if err != nil {fmt.Printf("couldn't convert number: %v\n", err)return
}
fmt.Println("Converted integer:", i)

A nil error denotes success; a non-nil error denotes failure.

package mainimport ("fmt""time"
)type MyError struct {When time.TimeWhat string
}func (e *MyError) Error() string {return fmt.Sprintf("at %v, %s",e.When, e.What)
}func run() error {return &MyError{time.Now(),"it didn't work",}
}func main() {if err := run(); err != nil {fmt.Println(err)}
}

4.Exercise: Errors

Copy your Sqrt function from the earlier exercise and modify it to return an error value.

Sqrt should return a non-nil error value when given a negative number, as it doesn't support complex numbers.

Create a new type

type ErrNegativeSqrt float64

and make it an error by giving it a

func (e ErrNegativeSqrt) Error() string

method such that ErrNegativeSqrt(-2).Error() returns "cannot Sqrt negative number: -2".

Note: A call to fmt.Sprint(e) inside the Error method will send the program into an infinite loop. You can avoid this by converting e first: fmt.Sprint(float64(e)). Why?

Change your Sqrt function to return an ErrNegativeSqrt value when given a negative number.

package mainimport ("fmt"
)func Sqrt(x float64) (float64, error) {return 0, nil
}func main() {fmt.Println(Sqrt(2))fmt.Println(Sqrt(-2))
}

5.Readers

The io package specifies the io.Reader interface, which represents the read end of a stream of data.

The Go standard library contains many implementations of this interface, including files, network connections, compressors, ciphers, and others.

The io.Reader interface has a Read method:

func (T) Read(b []byte) (n int, err error)

Read populates the given byte slice with data and returns the number of bytes populated and an error value. It returns an io.EOF error when the stream ends.

The example code creates a strings.Reader and consumes its output 8 bytes at a time.

package mainimport ("fmt""io""strings"
)func main() {r := strings.NewReader("Hello, Reader!")b := make([]byte, 8)for {n, err := r.Read(b)fmt.Printf("n = %v err = %v b =%v\n", n, err, b)fmt.Printf("b[:n] = %q\n", b[:n])if err == io.EOF {break}}
}

6 Images

Package image defines the Image interface:

package imagetype Image interface {ColorModel() color.ModelBounds() RectangleAt(x, y int) color.Color
}

Note: the Rectangle return value of the Bounds method is actually an image.Rectangle, as the declaration is inside package image.

(See the documentation for all the details.)

The color.Color and color.Model types are also interfaces, but we'll ignore that by using the predefined implementations color.RGBA and color.RGBAModel. These interfaces and types are specified by the image/color package

package mainimport ("fmt""image"
)func main() {m := image.NewRGBA(image.Rect(0, 0, 100, 100))fmt.Println(m.Bounds())fmt.Println(m.At(0, 0).RGBA())
}

这篇关于Methods and Interfaces Part3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262991

相关文章

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚

【VueJS】深入理解 computed 和 methods 方法

前言   模板内的表达式是非常便利的,但是它们实际上只用于简单的运算。在模板中放入太多的逻辑会让模板过重且难以维护。例如: <div id="example">{{ message.split('').reverse().join('') }}</div> computed 方法   所以引入了计算属性computed,将复杂的逻辑放入计算中进行处理,同时computed有缓存功能,

Vue3,格式化时间的函数作为组件的方法(methods)、计算属性(computed properties)来使用

确实,在Vue3组件中,你可以将这些用于格式化时间的函数作为组件的方法(methods)来使用,或者更优雅地,作为计算属性(computed properties)来使用,特别是当你需要基于响应式数据动态地格式化时间时。 作为方法(Methods) 在Vue组件的methods对象中定义这些函数,并在模板或其他方法中调用它们。 <template> <div> <p>Formatted

【ros2】 const builtin_interfaces::msg::Time timestamp解析

解析 const builtin_interfaces::msg::Time & timestamp 1. 数据类型 builtin_interfaces::msg::Time 是 ROS 2 中的一个消息类型,用于表示时间戳。 2. 结构 builtin_interfaces::msg::Time 包含以下字段: struct Time{std::uint32_t sec;std::

最长的一帧学习 part3

文章目录 八、osgUtil:: SceneView::cull ()part1 初始化必要的SceneView类成员变量part2 立体显示的处理part3 执行SceneView::cullStage函数,它也是场景视图筛选工作的核心函数part3.1 首先统计场景中的遮挡节点(OccluderNode),并使用CollectOccludersVisitor访问器遍历场景中的所有节点pa

Android方法数methods超过65536

当Android App中的方法数超过65535时,如果往下兼容到低版本设备时,就会报编译错误: Cannot fit requested classes in a single dex file. Try supplying a main-dex list.# methods: 86204 > 65536Message{kind=ERROR, text=Cannot fit request

7.5 Logical secure element Interfaces

必须是 ts_102221v170400p.pdf ts_102221v170100p.pdf 中没有 7.5 逻辑安全元素接口 UICC 可以支持逻辑安全接口(LSI)。如果 UICC 支持 LSI,这将在 ATR 中指示。 LSI 提供了一种复用机制,允许终端通过一个物理接口与多个逻辑安全元素(LSE)进行通信。 UICC 和终端支持的 LSI 应通过连续的数字从零开始标识。LSI 的

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中,可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法,因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中,使用 methods 选项定义获取用户信息方法和乘法计算方法。 <!DOCTYPE html><html lang="en"><head><meta ch

Vue中的methods方法与computed计算属性的区别

在创建的 Vue 应用程序实例中,可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法,因此可以像访问 data 数据那样来调用方法。在模板中绑定表达式只能用于简单的运算。如果运算比较复杂,可以使用 Vue.js 提供的 computed 计算属性,通过计算属性可以处理比较复杂的逻辑。那么 methods 方法与 computed 计算属性有什么区别?

Vue中data的属性可以和methods中方法同名吗,为什么?

在Vue中,data的属性不可以和methods中的方法同名,原因如下: 命名规范:从编程规范的角度来看,同名属性或方法可能会导致混淆和难以维护的代码。data通常用于存储组件的状态或数据,而methods则包含组件的行为或方法。将两者命名为相同的名称可能会使其他开发者或未来的你难以理解和维护代码。覆盖问题:在Vue的实例或组件中,data、methods、computed、watch等属性或方