三、go语言函数、方法、接口(go语言圣经笔记)

函数

声明

func name(parameter-list) (result-list){
	body
}

递归

多返回值

语法

// 用逗号隔开
return a, b

base return
如果返回值变量名在函数体内出现,return可以省略操作数。

错误

Go使用if和return处理异常,出现异常就返回

函数值

函数拥有类型,可以被赋值给其他变量,函数类型的0值是nil,不能调用值为nil的函数

匿名函数

5.6

可变参数

5.7

deferred函数

defer后面的函数会被延迟执行。直到包含该defer语句的函数执行完毕,defer后面的函数才会被执行。可以用于处理成对的操作,比如打开、关闭,加锁、释放锁

panic异常

Recover捕获异常

方法

方法和函数的最大区别是方法有接收者(从属),即方法都是有主人的。

声明

package geometry

import "math"

type Point struct{ X, Y float64 }

// traditional function
func Distance(p, q Point) float64 {
    return math.Hypot(q.X-p.X, q.Y-p.Y)
}

// 方法,p Point代表方法的接收器
func (p Point) Distance(q Point) float64 {
    return math.Hypot(q.X-p.X, q.Y-p.Y)
}
p := Point{1, 2}
q := Point{4, 6}
// 下面两种一个是函数,一个是方法
fmt.Println(Distance(p, q)) // "5", function call
fmt.Println(p.Distance(q))  // "5", method call

基于指针对象的方法

声明

func (p *Point) ScaleBy(factor float64) {
    p.X *= factor
    p.Y *= factor
}

调用
不管接收器是指针类型还是非指针类型,都可以通过指针/非指针类型进行调用,编译器会自动类型转换

r := &Point{1, 2}
r.ScaleBy(2)		

p := Point{1, 2}
p.ScaleBy(2)		// 会自动隐式调用&p来调用这个方法

通过嵌入结构体来扩展类型

// ColoredPoint 不是一个point,但是has a point,ColoredPoint拥有从Point引入的Distance等方法
type Point struct{ X, Y float64 }

type ColoredPoint struct {
    Point
    Color color.RGBA
}

可以直接通过ColoredPoint 去访问Point内的X和Y,比如cp.X

var cp ColoredPoint
cp.X = 1
fmt.Println(cp.Point.X) // "1"
cp.Point.Y = 2
fmt.Println(cp.Y) // "2"

可以把ColoredPoint类型当作接收器调用Point的方法

red := color.RGBA{255, 0, 0, 255}
blue := color.RGBA{0, 0, 255, 255}
var p = ColoredPoint{Point{1, 1}, red}
var q = ColoredPoint{Point{5, 4}, blue}
fmt.Println(p.Distance(q.Point)) // "5"
p.ScaleBy(2)
q.ScaleBy(2)
fmt.Println(p.Distance(q.Point)) // "10"

方法值和方法表达式

p := Point{1, 2}
q := Point{4, 6}

distanceFromP := p.Distance        // method value
fmt.Println(distanceFromP(q))      // "5"

接口

接口是golang中实现多态性的唯一好途径。
看到一个接口类型的值时,不知道它是什么,唯一知道的是可以通过它的方法来做什么

概念:https://blog.csdn.net/u011957758/article/details/81150622
深挖:https://www.jianshu.com/p/82436645927b

定义接口

// 输出value is <nil> type is <nil>
// 接口本身的值和类型是nil
package main

import "fmt"

type Shape interface {
	Area() float64
}

func main() {
	var s Shape
	fmt.Println("value is", s)
	fmt.Printf("type is %T\n", s)
}

实现接口

我们创建了Shape接口和矩形结构体类型Rect。 然后我们使用Rect接收器类型定义了Area方法。 因此Rect实现了这些方法。 由于这些方法是由Shape接口定义的,因此Rect实现了Shape接口。

/* 
输出
value is {5 4}
type is main.Rect
area is  20
s == r is  true
*/
package main

import "fmt"

type Shape interface {
	Area() float64
}

type Rect struct {
	width  float64
	height float64
}

func (r Rect) Area() float64 {
	return r.width * r.height
}
func main() {
	var s Shape
	s = Rect{5.0, 4.0}
	r := Rect{5.0, 4.0}
	fmt.Println("value is", s)
	fmt.Printf("type is %T\n", s)
	fmt.Println("area is ", s.Area())
	fmt.Println("s == r is ", s == r)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言圣经》是一本广受好评的教材,旨在帮助读者系统地学习和掌握Go语言。这本书以简明清晰的方式介绍了Go语言的各种特性、语法和用法,是入门和进阶者的理想选择。 首先,该书提供了对Go语言基础知识的全面介绍。它从简单到复杂地解释了Go语言的基本概念,诸如变量、函数、循环和条件语句等等。通过丰富的例子和练习,读者能够逐步理解和掌握这些概念。 其次,该书详细介绍了Go语言的高级特性和用法。读者可以学习到Go语言的面向对象编程、并发编程、网络编程等关键技术。并发编程是Go语言的一个独特特性,对于提高程序性能和扩展能力非常重要。 此外,该书还包含了对常见问题和陷阱的讲解,帮助读者避免一些常见的错误和陷阱。同时,书中提供了大量的案例和实践项目,读者可以通过实际操作来巩固所学内容。 《Go语言圣经》以其简洁明了的风格和对细节的深入讲解而闻名。无论是作为初学者的入门指南,还是作为有经验的开发者的参考书,这本书都能满足读者的需求。此外,该书的PDF版本能够方便地在线或离线阅读,为读者提供了更加便捷的学习体验。 综上所述,《Go语言圣经》是一本内容丰富、权威性强的优秀教材。它不仅适合Go语言的初学者,也适用于那些想要深入学习和掌握Go语言的开发者。无论是在线阅读还是PDF版本,读者都能够方便地获取和利用这本宝贵的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值