Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengenalan mendalam kepada penggunaan konteks Golang

Pengenalan mendalam kepada penggunaan konteks Golang

PHPz
PHPzasal
2023-04-11 09:14:041209semak imbas

Golang ialah bahasa pengaturcaraan yang berkuasa dengan kecekapan dan kesederhanaan, dan kini sedang berkembang pesat. Apabila menulis kod Go, parameter input dan output setiap fungsi mempunyai kitaran hayat mereka sendiri. Apabila berbilang Goroutine dijalankan pada masa yang sama, kami mungkin perlu mengurus konteks untuk memastikan ketepatan program Ini adalah peranan konteks Golang. Dalam artikel ini, kami akan memperkenalkan penggunaan konteks Golang.

1. Konsep Konteks Golang

Konteks Golang ialah objek yang mengandungi nilai yang berkaitan dalam julat permintaan. Objek ini boleh dihantar antara fungsi dan menyediakan sokongan untuk operasi pembatalan. Sebagai contoh, apabila memproses permintaan Http, kita boleh menggunakan pakej konteks untuk lulus permintaan Http sebagai parameter untuk mendapatkan konteks berkaitan permintaan.

Definasi struktur Konteks Golang adalah seperti berikut:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}

Definasi struktur di atas termasuk kaedah Tarikh Akhir, Selesai, Err dan Nilai Di bawah kami akan memperkenalkan fungsinya satu demi satu satu.

2. Penggunaan Konteks Golang

  1. Kaedah Tarikh Akhir

Kaedah Tarikh Akhir mengembalikan masa dan nilai Boolean. Apabila konteks dibatalkan atau mencapai tarikh akhir, konteks kembali kali ini dan nilai Boolean benar, jika tidak ia mengembalikan palsu. Sesetengah konteks tidak mempunyai tarikh akhir, yang mana kaedah Tarikh Akhir akan kembali palsu.

func main() {
    ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*5))
    defer cancel()
    
    select {
    case <-time.After(3 * time.Second):
        fmt.Println("等待了3秒钟")
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    }
}

Dalam kod di atas, mula-mula kita mencipta Konteks dengan Tarikh Akhir yang tarikh akhir adalah 5 saat selepas masa semasa. Kemudian kita menggunakan pernyataan pilih untuk menunggu selama 3 saat Pada masa ini kita akan mendapati bahawa program masih menunggu, kerana masa menunggu tidak melebihi Tarikh Akhir. Akhirnya, apabila tarikh akhir melebihi, program akan tamat kerana nilai pulangan ctx.Done().

  1. Kaedah Selesai

Kaedah Selesai mengembalikan saluran baca sahaja Saluran ini akan ditutup apabila konteks dibatalkan atau mencapai tarikh akhir. Oleh itu, kami boleh menggunakan penyataan pilih dan kaedah Selesai dalam kod kami untuk memantau status Konteks.

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println(ctx.Err())
                return
            default:
                fmt.Println("goroutine正在运行中...")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)

    // 模拟耗时操作
    time.Sleep(5 * time.Second)
    cancel() // 取消Context
    time.Sleep(3 * time.Second)
    fmt.Println("main函数执行结束")
}

Dalam kod di atas, kami menggunakan fungsi WithCancel dan membatalkan untuk memulakan dan menamatkan Konteks, dan mencetak log secara berkala dalam goroutine sehingga Konteks dibatalkan. Pada masa yang sama, kami menggunakan Tidur untuk mensimulasikan operasi yang memakan masa. Fungsi semasa memanggil fungsi batal selepas 5 saat, menamatkan Konteks dan dengan itu menamatkan keseluruhan program.

  1. Kaedah Err

Kaedah Err mengembalikan sebab Konteks dibatalkan. Untuk Konteks yang dibatalkan, kaedah ini akan mengembalikan nilai ralat bukan nol. Jika Konteks tidak dibatalkan, kaedah Err akan mengembalikan sifar.

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go func(ctx context.Context) {
        for {
            select {
            case <-ctx.Done():
                fmt.Println(ctx.Err())
                return
            default:
                fmt.Println("goroutine正在运行中...")
                time.Sleep(1 * time.Second)
            }
        }
    }(ctx)

    // 模拟耗时操作
    time.Sleep(5 * time.Second)
    cancel() // 取消Context
    time.Sleep(3 * time.Second)
    fmt.Println("main函数执行结束")
}

Dalam kod di atas, kaedah Err digunakan dalam goroutine, yang mengembalikan sebab pembatalan. Akhirnya, kami mencetak "pelaksanaan fungsi utama berakhir" dalam fungsi utama.

  1. Kaedah Nilai

Kaedah Nilai mengembalikan nilai yang dikaitkan dengan Konteks, yang merupakan antara muka jenis objek{}. Anda boleh menetapkan sebarang jenis nilai dalam Konteks dan menggunakan kaedah Nilai untuk mendapatkan nilai dalam operasi seterusnya.

type authKey string
func main() {
    ctx := context.WithValue(context.Background(), authKey("token"), "123456")
    fmt.Println(ctx.Value(authKey("token"))) // 打印"123456"
}

Dalam kod di atas, kami menggunakan kaedah WithValue untuk mengaitkan nilai jenis rentetan dengan Konteks dan menggunakan kaedah Nilai untuk mendapatkan nilai.

3. Ringkasan

Konteks Golang ialah bahagian penting dalam mengendalikan kod serentak. Dengan menghantar Konteks antara fungsi, kami boleh mengurus kitaran hayat dalam kod, dan kami juga boleh memantau status Konteks melalui kaedah seperti Selesai, Ralat dan Nilai. Menguasai penggunaan Konteks Golang boleh meningkatkan kualiti dan keselarasan kod anda.

Atas ialah kandungan terperinci Pengenalan mendalam kepada penggunaan konteks 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