풀어 주다: 2023-07-24 17:38:26
앞으로
1021명이 탐색했습니다.

생성자

공식적으로는 는 클래스가 인스턴스화될 때 을 실행하는 메서드라는 것입니다. 과제 운영합니다.

하지만 Go에서는 동일하지 않을 수 있으며, 이를 완성하려면 별도의 기능을 사용해야 합니다.

Structure

type Student struct {
    Name  string
    Age   int
    phone string
}
로그인 후 복사

Constructor

func NewStudent(name string, age int, phone string) *Student {
    return &Student{Name: name, Age: age, phone: phone}
}
//函数尽量采用固定格式 New结构体名
로그인 후 복사

할당 작업

func main() {
    var s1 = NewStudent("张三", 18, "1111")
    fmt.Println(s1)
}
로그인 후 복사

실행 결과

생성자가 구조체 포인터를 반환하는 이유

일반적으로 두 가지 이유가 있는데, 첫 번째 이유는 주소 전달 성능이 더 높다는 것이고, 두 번째 이유는 사양 때문입니다. 함수는 구조에 바인딩됩니다. 또한 이는 표준에 가깝습니다.

不太用纠结说指针怎么怎么看不懂,对于结构体来说,是不是指针,其实用法都一样。


函数绑定结构体

如果你有其他语言的基础,你可能对于类和对象比较熟悉,传统做法中,是将方法写入类中的。

但是在Go中,采用绑定的方式添加方法。

语法

func (一般用this 要绑定的结构体) 函数名([参数1,参数2...]) [(返回值1,返回值2,...)]{
    代码
}
//一般用this,也可以用其他的,this就像形参一样,随便换,用self,用p,用s,都一样的
로그인 후 복사

示例:给Student结构体绑定方法。

func (this Student) say() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
}
로그인 후 복사

main代码

func main() {
    //调用构造方法
    var s1 = NewStudent("张三", 18, "1111")
    //调用Student绑定的say方法
    s1.say()
}
로그인 후 복사

执行结果

有没有感觉有点Java和Python的感觉了,上述可是通过结构体的方式调用方法的,这里就和C区分开了。

在Go中,基本就是通过这些操作,模拟出来面向对象的,相比之下,我更习惯Go的方式,更加灵活。


函数绑定结构体(指针方式)

如果说区别,只是将要修改的 要绑定的结构体 前面加一个*

代码

func (this *Student) say() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
}
로그인 후 복사

执行结果和上述一摸一样。


函数绑定结构体(指针方式和普通方式区别)

通常来说,一般使用指针的方式居多。

嗯...不是居多,是基本都是。

区别

代码一

func (this Student) say1() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
    this.Name = "666"//这里修改了Name为其他值
}
로그인 후 복사

第3行修改了Name

func main() {
  //调用构造方法
  var s1 = NewStudent("张三", 18, "1111")
  //调用Student绑定的say方法
  s1.say1()
  //打印s1.Name
  fmt.Println(s1.Name)
}
로그인 후 복사
로그인 후 복사

第7行又打印了s1.Name

执行结果

???结果没修改,what。

代码二

func (this *Student) say1() {
  fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
  this.Name = "666"//这里修改了Name为其他值
}
로그인 후 복사

第一行修改为*

func main() {
  //调用构造方法
  var s1 = NewStudent("张三", 18, "1111")
  //调用Student绑定的say方法
  s1.say1()
  //打印s1.Name
  fmt.Println(s1.Name)
}
로그인 후 복사
로그인 후 복사

执行结果

这次可以看到,结果变了,在其他函数修改了Name,影响了整个s1的Name。


결론

  • 함수를 사용하여 구조를 바인딩할 때 구조 매개변수를 * 유형에 최대한 통합하도록 노력하세요.

  • 하나는 사양 때문이고, 다른 하나는 객체지향이 이래야 하기 때문입니다. 객체의 속성을 수정하는 것은 이론적으로 전체 객체 값에 영향을 주어야 합니다.

위 내용은 의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Go语言进阶学习
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿