Go言語の基礎の構造(夏章)

リリース: 2023-07-24 17:38:26
転載
908 人が閲覧しました

#コンストラクター関数

コンストラクター関数は他の言語と同じで、公式には # と理解されています。## のメソッドはクラスがインスタンス化されるときに実行され、通常は割り当てに使用されますオペレーション。

ただし、Go ではこれと異なる場合があり、これを完了するには別の関数を使用する必要があります。

構造

type Student struct { Name string Age int phone string }
ログイン後にコピー

コンストラクター

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言語の基礎の構造(夏章)

コンストラクターが構造体ポインターを返す理由

## 理由は大きく分けて 2 つあり、1 つ目はアドレスの受け渡しのパフォーマンスが高いため、2 つ目は仕様によるもので、その後の関数バインディング構造も同様であり、もっと見る. 標準です。

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


函数绑定结构体

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

但是在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() }
ログイン後にコピー

执行结果

Go言語の基礎の構造(夏章)

有没有感觉有点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

执行结果

Go言語の基礎の構造(夏章)

???结果没修改,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) }
ログイン後にコピー
ログイン後にコピー

执行结果

Go言語の基礎の構造(夏章)

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


結論

  • 関数を使用して構造体をバインドする場合は、構造体のパラメータを*# に統合するようにしてください。##の種類。

  • 1 つは仕様によるもの、もう 1 つはオブジェクト指向はこうあるべきであるため、理論的にはオブジェクトのプロパティを変更するとオブジェクト全体に影響を与えるはずです価値。

以上がGo言語の基礎の構造(夏章)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:Go语言进阶学习
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!