💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
### 概述 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种 带有接收者的函数,我们称为方法(method) .本质上,一个方法是一个和特殊类型关联的函数. 一个面向对 象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是 借助方法来做这些事情 . 在go语言中,可以给任意类型(包括内置类型,但不包括**指针类型**)添加相应的方法 .方法总是绑定对象实例, 并隐式将实例作为第一实参(receiver).方法语法如下 : func (receiver ReceiverType) funcName(parameters)(results) * 参数receiver可任意命名.放方法中未曾使用,可省略参数名 * 参数receiver类型可以是T或*T. 基类型T不能是接口或指针 * 不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法. ### 类型的本质 ~~~ 在声明一个新类型之后,声明一个该类型的方法之前,需要先回答一个问题:这个类型的本质 是什么。如果给这个类型增加或者删除某个值,是要创建一个新值,还是要更改当前的值?如 果是要创建一个新值,该类型的方法就使用值接收者。如果是要修改当前值,就使用指针接者。 这个答案也会影响程序内部传递这个类型的值的方式:是按值做传递,还是按指针做递。保持 传递的一致性很重要。这个背后的原则是,不要只关注某个方法是如何处理这个值,而要关注 这个值的本质是什么。 ~~~ **简单的说当对结构体的数据进行增加或删除时,使用值拷贝.进行修改时,使用引用地址** ### 实例 ~~~ type long int //给某个类型绑定一个函数 func (temp long) Add(other long) long { //temp叫接收者,接收者就是传递的一个参数 return temp + other } func main() { var a long = 2 //定义一个变量并赋值 fmt.Println(a.Add(4)) //得到结果是6 ~~~ ### 为结构体添加方法 ~~~ type Person struct { name string age int gender byte } //带有接收者的函数叫方法 func (tmp Person) PrintInfo() { fmt.Println(tmp) } //通过一个函数,给成员赋值 func (p *Person) setInfo(name string, age int, gender byte) { p.name = name p.age = age p.gender = gender } func main() { p := Person{"jack", 20, 1} p.PrintInfo() //定义一个结构体变量 var p2 Person p2.setInfo("milan", 18, 0) p2.PrintInfo() } ~~~ ~~~ {jack 20 1} {milan 18 0} ~~~ ### 不能为指针类型 ~~~ type pointer *int type long int func (p pointer)test(){ //报错,因为pointer不能为指针类型 } func (p *long)test(){ //这里可以通过 } ~~~ ### 接收者类型不同函数名可以同名 以下不会报错,因为函数的接收者类型不同. ~~~ type char byte type long int func (tmp char) test() { } func (tmp long) test() { } ~~~