Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah terdapat kelas di golang?

Adakah terdapat kelas di golang?

青灯夜游
青灯夜游asal
2023-01-12 16:56:043849semak imbas

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 {...}".

Adakah terdapat kelas di golang?

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.

Objek

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
}

Pembina

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

Kebenaran akses

Java mempunyai empat hak akses, seperti berikut:

aksara kawalan akses java
awam dilindungi
java访问控制符
  public protected

friendly

(default)

private
同一个类 yes yes yes yes
同一个包 yes yes yes no
不同包子类 yes yes no no
不同包非子类 yes no no no
mesra

(lalai)

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

Go telah memudahkannya, dan butiran keterlihatan minimum ialah pakej. Dalam erti kata lain, Go mengekalkan dua jenis, mesra dan awam. Jika huruf pertama nama pembolehubah Go ialah huruf kecil, ia bermakna ia boleh dilihat dalam pakej jika huruf pertama adalah huruf besar, ia bermakna ia boleh dilihat di mana-mana sahaja.

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)
}

Perlu diingatkan bahawa kaedah Go ialah fungsi khas, yang hanyalah sejenis gula sintaksis untuk pengkompil Mari lihat rujukan objek sebagai parameter pertama fungsi. Sebagai contoh, kod berikut adalah bersamaan dengan warisan

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()
}

Seperti yang ditunjukkan di bawah, Cat secara automatik memperoleh kaedah Animal's move() dan Shout() dengan mengagregatkan struktur Haiwan secara awanama:

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 melalui
type 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn