Rumah >pembangunan bahagian belakang >Golang >Bilakah Go mengembalikan nilai, mengembalikan rujukan atau tidak mengembalikan apa-apa?

Bilakah Go mengembalikan nilai, mengembalikan rujukan atau tidak mengembalikan apa-apa?

王林
王林ke hadapan
2024-02-05 23:24:031073semak imbas

Bilakah Go mengembalikan nilai, mengembalikan rujukan atau tidak mengembalikan apa-apa?

Kandungan soalan

Saya sedang menulis beberapa kod di mana beberapa fungsi mengemas kini item yang "dilalui melalui rujukan", sepanjang baris DoSomethingB di bawah. Sebagai seorang pemula, ini agak tidak intuitif bagi saya. Saya lebih suka mempunyai fungsi mengembalikan hasilnya (melainkan ia mungkin kaedah dan mengemas kini penerima).

Soalan:

  1. Adakah terdapat hujah yang baik untuk menggunakan corak seperti DoSomethingB Oleh DoSomethingA?
  2. ialah DoSomethingB (bukan kaedah struct) Adakah ini dianggap gaya yang bagus atau boleh diterima dalam Go?
package main

import (
    "fmt"
)

func DoSomethingA(someData int) int {
    return someData + 23
}

func DoSomethingB(someData *int) {
    *someData = *someData + 23
}

func DoSomethingC(someData *int) *int {
    tmp := *someData + 23
    return &tmp
}

func main() {
    someDataA := 19
    someDataB := 19
    someDataC := 19
    
    fmt.Printf("1) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
    
    someDataA = DoSomethingA(someDataA)
    DoSomethingB(&someDataB)
    someDataC = *DoSomethingC(&someDataC)
    
    fmt.Printf("2) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
}

Pergi ke Pautan Taman Permainan: https://play.golang.com/p/ELwljCaWDLg


Jawapan Betul


Sudah tentu, mari pecahkan soalan anda:

  1. DoSomethingB vs. DoSomethingA: Menggunakan corak seperti DoSomethingB 这样的模式会很有帮助,从而避免不必要的分配。但是,它可能会导致代码更难理解。使用 DoSomethingA berguna jika anda ingin mengubah suai pembolehubah asal tanpa membuat salinan, sekali gus mengelakkan peruntukan yang tidak perlu. Walau bagaimanapun, ia mungkin menjadikan kod lebih sukar untuk difahami. Menggunakan

    (hasil pulangan) biasanya lebih idiomatik dalam Go dan selalunya diutamakan atas sebab kebolehbacaan.
  2. Adakah DoSomethingB dianggap gaya yang bagus dalam Go? DoSomethingB: Walaupun bukan sesuatu yang luar biasa untuk melihat kod seperti

    dalam Go, terutamanya apabila berurusan dengan struktur data yang besar, pendekatan idiomatik Go menggalakkan nilai pulangan untuk mengubah suai penunjuk. Menggunakan penunjuk untuk mengubah suai nilai secara langsung (terutamanya untuk jenis terbina dalam seperti integer) boleh membawa kepada kod yang sukar difahami.

DoSomethingCContoh

akan dianggap tidak gramatis kerana ia mengembalikan penunjuk kepada pembolehubah setempat. Ini mungkin membawa kepada tingkah laku yang tidak ditentukan kerana lokasi memori mungkin digunakan semula untuk tujuan lain selepas fungsi kembali. Adalah lebih baik untuk mengelakkan corak ini.

DoSomethingA 这样的模式。如果您有充分的理由修改原始数据并且担心性能(例如大型数据结构),那么 DoSomethingBRingkasnya, jika anda ingin mengikuti idiomatik Go, lebih suka

corak ini. Jika anda mempunyai alasan kukuh untuk mengubah suai data asal dan bimbang tentang prestasi (cth. struktur data yang besar), maka 🎜 boleh diterima. 🎜

Atas ialah kandungan terperinci Bilakah Go mengembalikan nilai, mengembalikan rujukan atau tidak mengembalikan apa-apa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam