返回一个结构体变量的函数
这是一种面向对象的编程方法,go语言不是面向对象的编程语言它是面向接口的编程语言,但是可以通过结构体和函数来实现面向对象的功能
简单的例子,定义一个人的构造函数(人这个对象)
package main
import "fmt"
type person struct {
name string
age int
}
// 构造函数:约定成俗用new开头
// 返回的结构体还是结构体指针
// 当结构体比较大的时间尽量使用结构体指针,减少程序的内存开销
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
func main() {
p1 := newPerson("菜狗", 18)
p2 := newPerson("牛马", 35)
fmt.Println(p1, p2)
}
定义一个狗的构造函数(定义一个狗的对象)
type dog struct {
name string
age int
colors string
}
func newDog(name string, age int, colors string) *dog {
return &dog{
name: name,
age: age,
colors: colors,
}
}
func main() {
p3 := newDog("花花", 1, "灰白")
fmt.Println(p3)
}
go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者self。
方法的定义格式如下:
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
其中:
- 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self,this之类的命名。例如,person类型的接收者变量应该命名为p,connector类型的接收者应该命名为c等
- 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型
- 方法名,参数列表,返回参数:具体格式与函数定义相同
简单的例子
package main import "fmt" //定义一个结构体 type dog struct { name string } //定义一个构造函数 func newDog(name string) *dog { return &dog{ name: name, } } //定义一个构造函数的方法和接收者,d就是接收者 func (d dog) wang() { fmt.Printf("%v在汪汪汪", d.name) } func main() { d1 := newDog("花花") d1.wang() }
go中的函数中的值调用只是拷贝如果需要修改请使用指针来接受变量,进行修改
值接收
package main
import "fmt"
type person struct {
name string
age int
}
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
func (p person) ageguonian() {
p.age++
}
func main() {
p1 := newPerson("芜湖", 11)
//这里值为11
fmt.Println(p1.age)
p1.ageguonian() //age++只是加了age的副本并未修改原来的值
//这里的值还是11
fmt.Println(p1.age)
}
指针接收
指针就是传地址接受
package main
import "fmt"
type person struct {
name string
age int
}
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
func (p *person) ageguonian() { //这里传递的person是地址*取地址,&根据地址取值
p.age++
}
func main() {
p1 := newPerson("芜湖", 11)
//这里值为11
fmt.Println(p1.age)
p1.ageguonian()
//这里的值就是12
fmt.Println(p1.age)
}
什么时候应该使用指针类型接收者
- 需要修改接收者中的值
- 接收者是拷贝代价比较大的大对象
- 保证一致性,如果有某个方法使用了指针接受者,那么其他的方法也应该使用指针接收者
- 如果有一个值使用了指针接收者那么就应该都是以指针接受
- 尽量使用指针接受
任意类型添加方法
在Go语言中,接收者的类型可以是任何类型·,不仅仅是结构体,任何类型都可以拥有方法。举个例子,外面基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法
package main
import "fmt"
type myInt int
func (m myInt) hello() {
fmt.Println("hello")
}
func main() {
m1 := myInt(1000)
m1.hello()
}
不能给别的包里的类型定义方法,只能给自己包里的类型定义方法
标签:name,age,接收者,person,func,fmt,构造函数 From: https://www.cnblogs.com/suknna/p/17103295.html