Rumah >pembangunan bahagian belakang >Golang >Adakah terdapat kelas di golang?
Tiada kelas di golang. Golang bukan bahasa pengaturcaraan berorientasikan objek tulen Ia tidak mempunyai konsep kelas, dan tiada pewarisan Walau bagaimanapun, Go juga boleh mensimulasikan pengaturcaraan berorientasikan objek. Dalam Go, struct boleh dibandingkan dengan kelas dalam bahasa lain; struktur ditakrifkan melalui struct untuk mewakili jenis objek, seperti "type person struct {...}".
Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.
Tiga ciri utama berorientasikan objek: enkapsulasi, pewarisan dan polimorfisme.
Go bukanlah bahasa pengaturcaraan berorientasikan objek tulen Ia tidak mempunyai konsep kelas, dan tiada warisan. Tetapi Go juga boleh mensimulasikan pengaturcaraan berorientasikan objek, iaitu, struct boleh dibandingkan dengan kelas dalam bahasa lain.
Go tidak mempunyai konsep kelas Ia mentakrifkan struktur melalui struct untuk mewakili jenis objek.
type person struct { Age int Name string }
Objek ialah organisma keadaan dan tingkah laku. Contohnya, kod java berikut:
public class Person { int age; String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Tidak seperti Java, kaedah Go tidak perlu terikat pada data kelas dalam definisi kelas, hanya perlu ditakrifkan dalam pakej yang sama . Ini mungkin kelihatan pelik kepada pelajar yang baru mengenali Go.
type person struct { Age int Name string } func (p *person) GetAge() int { return p.Age } func (p *person) SetAge(age int) { p.Age = age } func (p *person) GetName() string { return p.Name } func (p *person) SetName(name string) { p.Name = name }
Go tidak mempunyai pembina, dan pembawa data objek ialah struct. Java menyokong pembina Nama pembina adalah sama dengan nama kelas Pembina berbilang dilaksanakan melalui lebihan fungsi.
Pembina Go disimulasikan melalui fungsi kilang. Contohnya adalah seperti berikut:
type person struct { Age int Name string } /** 构造函数1--通过名字初始化 */ func newPersonByName(name string) *person { return &person{ Name: name, } } /** 构造函数2--通过年龄初始化 */ func newPersonByAge(age int) *person { return &person{ Age: age, } }
Perlu diambil perhatian bahawa huruf pertama nama struktur orang hendaklah menggunakan huruf kecil untuk mengelakkan pintasan langsung luaran pembina simulasi
Java mempunyai empat hak akses, seperti berikut:
awam | dilindungi |
|
peribadi | ||||||||||||||||||||||||||
Kelas yang sama | ya | ya | ya | ya | |||||||||||||||||||||||||
Pakej yang sama | ya | ya | ya | tidak | |||||||||||||||||||||||||
Jenis roti yang berbeza | yaya | tidak | tidak | ||||||||||||||||||||||||||
Pakej yang berbeza bukan subkelas | ya | tidak | tidak | tidak |
Encapsulation
Encapsulation mengikat struktur abstrak dengan fungsi yang beroperasi pada data dalaman struktur. Program luaran hanya boleh mengubah suai keadaan dalaman struktur mengikut API fungsi yang dieksport (kaedah awam). Encapsulation mempunyai dua faedah: Sembunyikan pelaksanaan: Kami hanya mahu pengguna menggunakan API secara langsung untuk mengendalikan keadaan dalaman struktur tanpa mengetahui logik dalaman. Seperti gunung ais, kita hanya melihat bahagian di atas air. Lindungi data: Kami boleh mengenakan langkah keselamatan pada pengubahsuaian dan akses data Apabila memanggil kaedah penetap, kami boleh mengesahkan parameter apabila memanggil kaedah pengambil, kami boleh menambah log akses, dsb.type person struct { Age int Name string } func NewPerson(age int, name string) *person{ return &person{age, name} } func (p *person) SetAge(age int) { p.Age = age } func (p *person) SetName(name string) { p.Name = name } func main() { p:= NewPerson(10, "Lily") p.SetName("Lucy") p.SetAge(18) }
Definisi kacang mudah kelihatan seperti ini:
func main() { p:= NewPerson(10, "Lily") p.SetName("Lily1") // 等价于下面的写法 // p是一个引用,函数引用 setNameFunc := (*person).SetName setNameFunc(p, "Lily2") fmt.Println(p.Name) }
warisan
Jika kelas anak mewarisi kelas induk, ia akan memperoleh ciri dan tingkah laku kelas induk. Tujuan utama pewarisan adalah untuk menggunakan semula kod. Dua alat utama Java untuk penggunaan semula kod ialah warisan dan komposisi. Go tidak mempunyai konsep kelas, dan tiada warisan. Tetapi Go boleh mensimulasikan warisan melalui gubahan tanpa nama.type Animal struct { Name string } func (Animal) move() { fmt.Println("我会走") } func (Animal) shout() { fmt.Println("我会叫") } type Cat struct { Animal // 匿名聚合 } func main() { cat := &Cat{Animal{"猫"}} cat.move() cat.shout() }
Polymorphism
Polimorfisme, pembolehubah yang diisytiharkan sebagai kelas asas, boleh menunjuk kepada subkelas yang berbeza pada masa jalan dan kaedah panggilan subkelas yang berbeza. Tujuan polimorfisme adalah untuk mencapai keseragaman.interface Animal { void move(); void shout(); } class Dog implements Animal { @Override public void move() { System.out.println("我会走"); } @Override public void shout() { System.out.println("我会叫"); } }
Kami melaksanakan polimorfisme melalui antara muka. Dalam Java, kami mentakrifkan antara muka melalui antara muka dan melaksanakan antara muka melalui implement.
Buat kesimpulan melaluitype Animal interface { move() shout() } type Cat struct { Animal // 匿名聚合 } func (Cat)move() { fmt.Println("猫会走") } func (Cat)shout() { fmt.Println("猫会叫") } type Dog struct { Animal // 匿名聚合 } func (Dog)move() { fmt.Println("狗会走") } func (Dog)shout() { fmt.Println("狗会叫") } func main() { cat := Cat{} dog := Dog{} // 申明接口数组 animals := []Animal{cat, dog} for _,ele := range animals { // 统一访问 ele.move() ele.shout() } }jenis itik
bahawa selagi objek kelihatan seperti itik dan kuak seperti itik, maka ia adalah itik. Dalam erti kata lain, antara muka Go adalah agak tersembunyi Selagi objek melaksanakan semua kaedah yang diisytiharkan oleh antara muka, ia dianggap milik antara muka. [Cadangan berkaitan: Pergi tutorial video
, Pengajaran pengaturcaraan]Atas ialah kandungan terperinci Adakah terdapat kelas di golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!