封装
1. 名字一般使用CamelCase
2. 首字母大写:public
3. 首字母小写: private
包
1. 为结构定义的方法必须放在同一个包内
2. 可以是不同文件
package queues
type Quene []int
func (q *Quene) AddQuene(val int) {
*q = append(*q, val)
}
func (q *Quene) Pop() int {
head := (*q)[0]
*q = (*q)[1:]
return head
}
func (q *Quene) IsEnpty() bool {
return len(*q) == 0
}
package main
import (
"fmt"
"GoHeloWorld/quence/queues"
)
func main() {
q := queues.Quene{1}
q.AddQuene(2)
q.AddQuene(3)
fmt.Println()
if q.IsEnpty() {
fmt.Printf("q is Empty")
} else {
fmt.Printf("q=%d", q.Pop())
}
fmt.Println()
if q.IsEnpty() {
fmt.Printf("q is Empty")
} else {
fmt.Printf("q=%d", q.Pop())
}
}
在go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法
方法总是半丁对象实例,并将实例作为第一实参(receiver),方法的语法如下;
func (receiver ReciverType) funcName(parameters) (results)
1. 参数receiver可以任意命名,如方法中未曾使用,可省略参数名
2. 参数receiver类型可以是T或者*T, 基类型T不能是接口或指针
//point为接受者类型,它本身不能是指针类型
//type point *int
//func (tmp point) Add03(other point) point {
//}
3. 不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法
//面向过程
func Add01(a, b int) int {
return a + b
}
//面向对象,方法:给某个类型绑定一个函数
type long int
//tmp叫接收者,接收者就是传递的一个参数
func (tmp long) Add02(other long) long {
return tmp + other
}
func main() {
var result int
result = Add01(1, 2) //普通函数调用方式
fmt.Println("result = ", result)
//定义一个变量
var a long = 2
//调用方式格式: 变量名,函数(所需参数)
r := a.Add02(2)
fmt.Println("r = ", r)
}