网站建设教程 mysql,wordpress网站全过程,济宁最新通知今天,wordpress建立模板下载第 1 章 方法
Go 语言也支持面向对象的思想#xff1b;所谓面向对象编程#xff1a;1对象就是简单的一个值或者变量#xff0c;并且拥有其方法2方法是某种特定类型的函数3 面向对象编程就是使用方法来描述每个数据结构的属性和操作#xff1b; 使用者不需要了解对象本身的…第 1 章 方法
Go 语言也支持面向对象的思想所谓面向对象编程1对象就是简单的一个值或者变量并且拥有其方法2方法是某种特定类型的函数3 面向对象编程就是使用方法来描述每个数据结构的属性和操作 使用者不需要了解对象本身的实现 1.1 方法声明
方法声明方法声明概述 方法的声明和普通函数的声明类似只是在函数名字前面多了一个类型参数 这个参数把这个方法绑定到对应的类型上 代码示例 gop1.io/ch6/geometry package geometry import math type Point struct{ X Y float64 } // 普通的函数定义 func Distance(pq Point) float64 { return math.Hypot(q.X - p.X q.Y - p.Y) } // Point 类型的方法 func (p Point) Distance(q Point) float64 { return math.Hypot(q.X - p.X q.Y - p.Y) } 关于接收者附加的参数 p 称为方法的接收者用来描述主调方法向对象发送消息 Go 语言中接收者不使用特殊名比如 this 或 self 我们自己选择接收者名字就像其他的参数变量名一样 接收者会频繁地使用因此最好能够选择简短且在整个方法中名称始终保持一致的名字 最常用的办法是取类型名称的首字母小写就像 Point 中的 p 方法调用 调用方法的时候接收者在方法名的前面 这样调用就和声明保持顺序一致了 p : Point{12} q : Point{34} fmt.Println(Distance(pq)) // 函数调用 fmt.Println(p.Distance(q)) // 方法调用 上面两个 Distance 函数声明没有冲突第一个声明了一个包级别的函数geometry.Distance第二个声明了一个类型 Point 的方法其名字为 Point.Distance表达式 p.Distance 称为选择子selector因为 p.Distance 为接收者 p 选择合适的 Distance 方法选择子语法也用于选择结构类型中的某些字段值就像 p.X 中的字段值 由于方法和字段来自于同一个命名空间在同一个结构类型中因此在 Point 结构类型中声明一个叫 X 的方法会与字段 X 冲突编译器会报错 小结 同类型中不能存在同名的标识符 因为每一个类型有其自己的命名空间所以我们能够在其他不同的类型中使用名字 Distance 作为方法名 定义一个 Path 类型表示一条线段同样也使用 Distance 作为方法名 // Path 是连接多个点的直线段 type Path [ ]Point // Distance 方法返回路径的长度 func (path Path) Distance() float64 { sum : 0.0 for i : range path { if i 0 { sum path[i-1].Distance(path[i]) } } return sum } path 是一个命名的 slice 类型而非 Point 这样的结构体类型但我们依旧可以给它定义方法 Go 和许多其他面向对象的语言不同 在 Go 语言中可以将方法绑定到任何类型上 我们可以很方便地为简单的类型如数字 、字符串 、slice 、map 甚至函数等定义附加的行为方法同一个包下的任何类型都可以声明方法只要它的类型既不是指针类型也不是接口类型 这两个 Distance 方法Point.Distance 和 Path.Distance拥有不同的类型 它们彼此无关尽管 Path.Distance 在内部使用 Point.Distance 来计算线段相邻点之间的距离 总结 在同一个结构类型中 字段与字段不能同名 方法与方法不能同名 字段与方法不能同名 但在两个不同的结构类型中可以存在相同名称的字段或方法前提是相同的字段或方法所属的类型不同 1.2 指针接收者的方法 1.3 通过结构体内嵌来组成新类型 1.4 方法变量与表达式 1.5 示例位向量 1.6 封装