Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menukar Sekeping Rentetan kepada Sekeping Jenis Tersuai dengan Selamat dalam Go?

Bagaimanakah Saya Boleh Menukar Sekeping Rentetan kepada Sekeping Jenis Tersuai dengan Selamat dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-09 15:18:15823semak imbas

How Can I Safely Convert a Slice of Strings to a Slice of Custom Types in Go?

Penukaran Jenis: Rentetan kepada Jenis Tersuai

Dalam Go, menukar sekeping rentetan kepada sekeping jenis tersuai boleh menjadi mencabar. Pertimbangkan contoh berikut:

package main

import "fmt"

type Card string
type Hand []Card

func NewHand(cards []Card) Hand {
    hand := Hand(cards)
    return hand
}

func main() {
    value := []string{"a", "b", "c"}
    firstHand := NewHand(value)
    fmt.Println(firstHand)
}

Kod ini akan mengakibatkan ralat pengkompil:

cannot use value (type []string) as type []Card in argument to NewHand

Punca ralat ini terletak pada keputusan reka bentuk spesifikasi untuk mengelakkan penukaran tidak sengaja antara jenis yang tidak berkaitan yang secara kebetulan berkongsi struktur yang sama. Walau bagaimanapun, dalam keadaan tertentu, anda mungkin perlu menukar antara kepingan tersebut.

Penukaran Tidak Selamat

Walaupun secara teknikal tidak mustahil untuk menukar antara kepingan dengan jenis asas yang sama , pendekatan selamat melibatkan menyalin kepingan. Namun begitu, adalah mungkin untuk melakukan penukaran langsung (tanpa menyalin) menggunakan pakej yang tidak selamat:

value := []string{"a", "b", "c"}
// convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)

Awas

Menggunakan pakej yang tidak selamat memerlukan kewaspadaan yang melampau kerana ia membenarkan atur cara memintas sistem jenis dan mengakses memori sewenang-wenangnya. Jika penukaran adalah penting, adalah dinasihatkan untuk mempertimbangkan pilihan lain, seperti menentukan jenis baharu yang merangkumi kedua-dua jenis rentetan dan kad serta melakukan penukaran yang selamat dalam struktur tersebut.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Sekeping Rentetan kepada Sekeping Jenis Tersuai dengan Selamat dalam Go?. 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