Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Bagaimana untuk mengelakkan pertindihan kod yang memerlukan pemilihan jenis dinamik?

Bagaimana untuk mengelakkan pertindihan kod yang memerlukan pemilihan jenis dinamik?

Feb 10, 2024 pm 02:06 PM
overflow

Bagaimana untuk mengelakkan pertindihan kod yang memerlukan pemilihan jenis dinamik?

Semasa menulis kod, kita sering menghadapi situasi di mana kita perlu memilih jenis kod yang berbeza berdasarkan keadaan yang berbeza. Dalam kes ini, tanpa pengendalian yang betul, kod mungkin menjadi verbose dan berulang. Jadi, bagaimana untuk mengelakkan pertindihan kod ini? Editor PHP Baicao telah membawakan anda beberapa penyelesaian yang mudah dan berkesan, mari kita lihat!

Kandungan soalan

Kod berikut ialah contoh ringkas penghurai strim video. Input adalah data binari yang mengandungi bingkai video dan audio. Setiap bingkai terdiri daripada bahagian berikut:

  1. Bendera jenis bingkai, menunjukkan sama ada ia adalah bingkai video atau bingkai audio
  2. Tajuk
  3. Muat bayar

Matlamatnya adalah untuk menghuraikan strim, mengekstrak medan daripada pengepala dan muatan.

Jadi, kaedah pertama ialah:

package main
import (
    "fmt"
    "encoding/binary"
    "bytes"
)

type Type byte

const (
    Video  Type = 0xFC
    Audio   Type = 0xFA
)

var HMap = map[Type]string {
    Video:   "Video",
    Audio:   "Audio",
}

type CommonHeader struct {
    Type      Type
}

type HeaderVideo struct {
    Width       uint16
    Height      uint16
    Length      uint32
}

type HeaderAudio struct {
    SampleRate  uint16
    Length      uint16
}


func main() {
    data := bytes.NewReader([]byte{0xFC, 0x80, 0x07, 0x38, 0x04, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0xFA, 0x10, 0x00, 0x01, 0x00, 0xFF})
    var cHeader CommonHeader
    var dataLength int
    for {
        err := binary.Read(data, binary.LittleEndian, &cHeader)
        if err != nil {
            break
        }
        fmt.Println(HMap[cHeader.Type])
        switch cHeader.Type {
            case Video:
                var info HeaderVideo
                binary.Read(data, binary.LittleEndian, &info)
                dataLength = int(info.Length)
                fmt.Println(info)
            case Audio:
                var info HeaderAudio
                binary.Read(data, binary.LittleEndian, &info)
                dataLength = int(info.Length)
                fmt.Println(info)
        }
        payload := make([]byte, dataLength)
        data.Read(payload)
        fmt.Println(payload)
    }
}
Salin selepas log masuk

Ia berfungsi, tetapi saya tidak suka pertindihan kod dalam kes switch. Pada asasnya, kita perlu mengulangi kod yang sama, hanya kerana jenis bingkai berbeza.

Salah satu cara untuk mencuba dan mengelakkan pertindihan adalah:

package main
import (
    "fmt"
    "encoding/binary"
    "bytes"
)

type Type byte

const (
    Video  Type = 0xFC
    Audio   Type = 0xFA
)

var HMap = map[Type]string {
    Video:   "Video",
    Audio:   "Audio",
}

type CommonHeader struct {
    Type      Type
}

type Header interface {
    GetLength() int
}

type HeaderVideo struct {
    Width       uint16
    Height      uint16
    Length      uint32
}

func (h HeaderVideo) GetLength() int {
    return int(h.Length)
}

type HeaderAudio struct {
    SampleRate  uint16
    Length      uint16
}

func (h HeaderAudio) GetLength() int {
    return int(h.Length)
}

var TMap = map[Type]func() Header {
    Video:     func() Header { return &HeaderVideo{} },
    Audio:     func() Header { return &HeaderAudio{} },
}

func main() {
    data := bytes.NewReader([]byte{0xFC, 0x80, 0x07, 0x38, 0x04, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0xFA, 0x10, 0x00, 0x01, 0x00, 0xFF})
    var cHeader CommonHeader
    for {
        err := binary.Read(data, binary.LittleEndian, &cHeader)
        if err != nil {
            break
        }
        fmt.Println(HMap[cHeader.Type])
        info := TMap[cHeader.Type]()
        binary.Read(data, binary.LittleEndian, info)
        fmt.Println(info)
        payload := make([]byte, info.GetLength())
        data.Read(payload)
        fmt.Println(payload)
    }
}
Salin selepas log masuk

Iaitu, kami memperkenalkan kaedah TMap 映射来实现动态类型选择,该映射允许根据帧类型创建正确结构的实例。但是,此解决方案的代价是对每种帧类型重复 GetLength().

Saya merasa sangat mengganggu bahawa nampaknya tiada cara untuk mengelakkan pertindihan sepenuhnya. Adakah saya terlepas sesuatu, atau adakah ia hanya batasan bahasa?

Ini ialah soalan berkaitan (sebenarnya dicetuskan oleh masalah yang sama), namun, premisnya mengabaikan keperluan untuk pemilihan jenis dinamik, jadi penyelesaian yang diterima (menggunakan generik) tidak membantu.

Penyelesaian

Jawapan King memerlukan ia diulang untuk setiap jenis integer yang digunakan untuk mengekod panjang. Jawapan Mondarin menggunakan pakej reflect yang hebat. Berikut adalah penyelesaian untuk mengelakkan kedua-dua masalah. Jawapan ini berdasarkan jawapan King.

Isytihar jenis generik menggunakan kaedah GetLength().

type Length[T uint8 | uint16 | uint32 | uint64] struct { Length T }

func (l Length[T]) GetLength() int { return int(l.Length) }
Salin selepas log masuk

Alih keluar kaedah GetLength daripada setiap jenis pengepala. Benamkan jenis panjang biasa dalam setiap jenis pengepala:

type HeaderVideo struct {
    Width  uint16
    Height uint16
    Length[uint32]
}

type HeaderAudio struct {
    SampleRate uint16
    Length[uint16]
}
Salin selepas log masuk

Dinyatakan dalam soalan TMap as。 GetLengthKaedah disediakan oleh medan terbenam.

var TMap = map[Type]func() Header{
    Video: func() Header { return &HeaderVideo{} },
    Audio: func() Header { return &HeaderAudio{} },
}
Salin selepas log masuk

https://www.php.cn/link/ceb9f6b8ffa77c49b6b4570ea19c76bf

(Seperti kod dalam soalan, jawapan ini menggunakan pakej binary.Read 函数间接使用 reflect 包。reflect secara tidak langsung melalui fungsi binari.Baca.

Pakej ialah alat yang hebat untuk memastikan kod anda kering.) 🎜

Atas ialah kandungan terperinci Bagaimana untuk mengelakkan pertindihan kod yang memerlukan pemilihan jenis dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Harga Bitcoin sejak kelahirannya 2009-2025 Ringkasan paling lengkap harga sejarah BTC Jan 15, 2025 pm 08:11 PM

Sejak penubuhannya pada tahun 2009, Bitcoin telah menjadi peneraju dalam dunia mata wang kripto dan harganya telah mengalami turun naik yang besar. Untuk memberikan gambaran keseluruhan sejarah yang komprehensif, artikel ini menyusun data harga Bitcoin dari 2009 hingga 2025, meliputi peristiwa pasaran utama, perubahan dalam sentimen pasaran dan faktor penting yang mempengaruhi pergerakan harga.

Gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya Koleksi lengkap trend harga sejarah Bitcoin. Gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya Koleksi lengkap trend harga sejarah Bitcoin. Jan 15, 2025 pm 08:14 PM

Bitcoin, sebagai mata wang kripto, telah mengalami turun naik pasaran yang ketara sejak penubuhannya. Artikel ini akan memberikan gambaran keseluruhan harga sejarah Bitcoin sejak kelahirannya untuk membantu pembaca memahami arah aliran harga dan detik pentingnya. Dengan menganalisis data harga sejarah Bitcoin, kami dapat memahami penilaian pasaran terhadap nilainya, faktor yang mempengaruhi turun naiknya, dan menyediakan asas untuk keputusan pelaburan masa hadapan.

Senarai harga sejarah sejak kelahiran carta Trend Harga Sejarah Bitcoin BTC (Ringkasan Terkini) Senarai harga sejarah sejak kelahiran carta Trend Harga Sejarah Bitcoin BTC (Ringkasan Terkini) Feb 11, 2025 pm 11:36 PM

Sejak penciptaannya pada tahun 2009, harga Bitcoin telah mengalami beberapa turun naik utama, meningkat kepada $ 69,044.77 pada November 2021 dan jatuh ke $ 3,191.22 pada Disember 2018. Sehingga Disember 2024, harga terkini telah melebihi $ 100,204.

Harga terbaru Bitcoin pada 2018-2024 USD Harga terbaru Bitcoin pada 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Harga USD Bitcoin masa nyata Faktor yang menjejaskan harga bitcoin Petunjuk untuk meramalkan harga bitcoin masa depan Berikut adalah beberapa maklumat penting mengenai harga Bitcoin pada 2018-2024:

Ringkasan Butiran Harga Sejarah yang Paling Lengkap Sejak Kelahiran Bitcoin (versi terkini pada tahun 2025) Ringkasan Butiran Harga Sejarah yang Paling Lengkap Sejak Kelahiran Bitcoin (versi terkini pada tahun 2025) Feb 15, 2025 pm 06:45 PM

Node penting untuk harga bersejarah Bitcoin 3 Januari 2009: Blok Kejadian dihasilkan, bitcoin pertama dihasilkan, dengan nilai USD 0. 5 Oktober: Transaksi Bitcoin pertama, seorang pengaturcara membeli dua pizza dengan 10,000 bitcoin, bersamaan dengan $ 0.008. 9 Februari 2010: Mt. Gox Exchange pergi dalam talian dan menjadi platform utama untuk perdagangan Bitcoin awal. 22 Mei: Bitcoin memecahkan $ 1 untuk kali pertama. 17 Julai: Harga Bitcoin menjunam ke $ 0.008, memukul rendah sepanjang masa. 9 Februari 2011: Harga bitcoin pecah melalui $ 10 untuk kali pertama. 10 April: Mt. Pergi

Di era CHATGPT, bagaimanakah masyarakat Q & A teknikal dapat bertindak balas terhadap cabaran? Di era CHATGPT, bagaimanakah masyarakat Q & A teknikal dapat bertindak balas terhadap cabaran? Apr 01, 2025 pm 11:51 PM

Komuniti Q & A Teknikal di Era CHATGPT: Strategi Respons Segmentfault StackOverflow ...

Dalam satu artikel, pelajari: Apakah kadar dana mata wang maya dan cara menggunakan kadar dana untuk perdagangan Dalam satu artikel, pelajari: Apakah kadar dana mata wang maya dan cara menggunakan kadar dana untuk perdagangan Feb 15, 2025 pm 10:06 PM

Kadar pendanaan mata wang maya adalah yuran yang dikenakan kepada peniaga yang memegang jawatan dalam perdagangan derivatif. Ia mencerminkan premium atau diskaun antara harga pasaran tempat dan harga kontrak niaga hadapan apabila kontrak tamat. Apabila harga spot lebih tinggi daripada harga niaga hadapan, kadar modal adalah negatif, yang bermaksud bahawa peniaga -peniaga yang berpendapatan pendek membayar yuran kepada pedagang yang jangka panjang. Sebaliknya, apabila harga spot lebih rendah daripada harga niaga hadapan, kadar modal adalah positif, yang bermaksud bahawa peniaga yang melakukan yuran membayar panjang kepada peniaga yang melakukan kedudukan pendek.

Analisis mata wang maya yang paling menjanjikan pada tahun 2025 Top 10 potensi inventori mata wang maya pada tahun 2025 Analisis mata wang maya yang paling menjanjikan pada tahun 2025 Top 10 potensi inventori mata wang maya pada tahun 2025 Feb 15, 2025 pm 05:51 PM

Pasaran mata wang maya sentiasa berkembang dan pertumbuhan yang menarik dijangka pada tahun -tahun akan datang. Pada tahun 2025, beberapa kriptografi dijangka menonjol dan menjadi pelaburan yang paling menjanjikan di ruang angkasa. Artikel ini menganalisis beberapa mata wang maya yang paling menjanjikan pada tahun 2025, yang meliputi keupayaan unik mereka, potensi pertumbuhan dan kemungkinan yang memberi kesan kepada masa depan. Mata wang ini termasuk Ethereum, Bitcoin, Cardano, Polkadot dan Binance Coin, yang memainkan peranan penting dalam pembangunan kewangan yang terdesentralisasi, kontrak pintar dan teknologi blockchain. Memahami potensi mata wang maya ini, pelabur boleh bersedia untuk merebut peluang yang dibawa oleh pasaran mata wang maya pada tahun 2025.

See all articles