首页 > 其他分享 >构造函数

构造函数

时间:2023-02-08 21:13:48浏览次数:41  
标签:name age 接收者 person func fmt 构造函数

返回一个结构体变量的函数

这是一种面向对象的编程方法,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)
}

什么时候应该使用指针类型接收者

  1. 需要修改接收者中的值
  2. 接收者是拷贝代价比较大的大对象
  3. 保证一致性,如果有某个方法使用了指针接受者,那么其他的方法也应该使用指针接收者
  4. 如果有一个值使用了指针接收者那么就应该都是以指针接受
  5. 尽量使用指针接受

任意类型添加方法

在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

相关文章