Bagaimana untuk mencipta jenis tersuai yang tidak boleh diubah di Golang?

WBOY
Lepaskan: 2024-06-02 09:41:57
asal
561 orang telah melayarinya

Ya, mencipta jenis tersuai yang tidak boleh diubah dalam Go memberikan banyak faedah, termasuk keselamatan rangkaian, kemudahan penaakulan dan pengendalian ralat yang lebih kukuh. Untuk mencipta jenis tidak boleh ubah, anda perlu mengikuti langkah berikut: Tentukan jenis: Isytiharkan jenis tersuai yang mengandungi pembolehubah ahli dan tidak sepatutnya termasuk penunjuk. Isytiharkan ketakbolehubah: Pastikan semua pembolehubah ahli ialah jenis asas atau jenis tidak berubah lain dan elakkan menggunakan kepingan, peta atau penunjuk. Gunakan kaedah penerima nilai: Gunakan penerima nilai untuk kaedah yang dikaitkan dengan jenis, tidak membenarkan peruntukan literal struktur dan memaksa kaedah untuk beroperasi hanya pada diri mereka sendiri.

如何在 Golang 中创建不可变自定义类型?

Bagaimana untuk mencipta jenis tersuai tidak berubah dalam Go?

Mencipta jenis tersuai tidak berubah dalam Go memberikan banyak faedah, termasuk keselamatan rangkaian, kemudahan penaakulan dan pengendalian ralat yang lebih kukuh. Untuk mencipta jenis tidak boleh ubah, anda boleh mengikuti langkah berikut:

  1. Tentukan jenis: Buat jenis tersuai dan isytiharkannya menggunakan kata kunci type. Petunjuk tidak boleh dimasukkan dalam pengisytiharan. type 关键字对其进行声明。声明中不应包括指针。
type ImmutableType struct {
    // 成员变量
}
Salin selepas log masuk
  1. 定义不可变性:确保所有成员变量都是基础类型或其他不可变类型,例如结构体或接口。避免使用切片、映射或指针,因为它们可以指向可变数据。
type ImmutableType struct {
    Name string
    Age  int
}
Salin selepas log masuk
  1. 使用值接收器方法:对于与类型关联的方法,使用值接收器(而不是指针接收器)。值接收器强制方法仅对类型实例本身进行操作,而不允许修改外部状态。
func (i ImmutableType) GetName() string {
    return i.Name
}
Salin selepas log masuk
  1. 禁用结构体字面量分配:Go 允许使用结构体字面量为结构体赋值。但是,对于不可变类型,应将此功能禁用,因为它允许绕过类型的不变性。使用 //go:nosumtype
  2. //go:nosumtype
    type ImmutableType struct {
        Name string
        Age  int
    }
    Salin selepas log masuk

      Tentukan kebolehubah: Pastikan semua pembolehubah ahli ialah jenis asas atau jenis tidak berubah lain, seperti struct atau antara muka. Elakkan daripada menggunakan kepingan, peta atau penunjuk kerana ia boleh menunjukkan kepada data boleh ubah.

      package main
      
      import "fmt"
      
      // 不可变类型
      type Person struct {
          Name string
          Age  int
      }
      
      func main() {
          // 创建一个不可变实例
          person := Person{Name: "John", Age: 30}
      
          // 尝试修改成员变量(编译时错误)
          // person.Name = "Jane"
      
          // 通过值接收器获取值
          name := person.GetName()
      
          fmt.Println(name) // 输出:John
      }
      Salin selepas log masuk

        Gunakan kaedah penerima nilai: 🎜Untuk kaedah yang dikaitkan dengan jenis, gunakan penerima nilai (bukannya penerima penunjuk). Penerima nilai memaksa kaedah untuk beroperasi hanya pada contoh jenis itu sendiri dan tidak membenarkan pengubahsuaian keadaan luaran. 🎜🎜rrreee
          🎜🎜Lumpuhkan tugasan literal struktur: 🎜Go membenarkan literal struktur digunakan untuk menetapkan nilai kepada struktur. Walau bagaimanapun, ciri ini harus dilumpuhkan untuk jenis tidak berubah, kerana ia membenarkan kebolehubah jenis dipintas. Ini boleh dicapai menggunakan anotasi //go:nosumtype. 🎜🎜rrreee🎜🎜Contoh Praktikal: 🎜🎜rrreee🎜Dengan mengikuti langkah ini, anda boleh mencipta jenis tersuai tidak berubah dalam Go, dengan itu meningkatkan keselamatan, kemunasabahan dan keteguhan program anda. 🎜

      Atas ialah kandungan terperinci Bagaimana untuk mencipta jenis tersuai yang tidak boleh diubah di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:php.cn
    Kenyataan Laman Web ini
    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
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!