Rumah > pembangunan bahagian belakang > Golang > Mengapa Saya Tidak Boleh Menukar Secara Terus Antara Kepingan Pelbagai Jenis dalam Go?

Mengapa Saya Tidak Boleh Menukar Secara Terus Antara Kepingan Pelbagai Jenis dalam Go?

Linda Hamilton
Lepaskan: 2024-12-03 14:36:12
asal
834 orang telah melayarinya

Why Can't I Directly Convert Between Slices of Different Types in Go?

Sekatan Penukaran Jenis dalam Go

Go menguatkuasakan peraturan menaip yang ketat, yang boleh menghalang penukaran yang kelihatan jelas antara kepingan jenis berbeza yang mengandungi asas yang sama elemen. Sekatan ini jelas dalam kod 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)
}
Salin selepas log masuk

Walaupun terdapat persamaan antara []rentetan dan []Kad, pengkompil melaporkan ralat:

cannot use value (type []string) as type []Card in argument to NewHand
Salin selepas log masuk

Rasional

Spesifikasi Go melarang penukaran ini untuk mengelakkan penukaran jenis tidak sengaja antara jenis yang tidak berkaitan yang secara kebetulan berkongsi struktur yang sama.

Penyelesaian

  • Salin Selamat: Pendekatan yang disyorkan ialah menyalin kandungan kepingan ke jenis yang diingini.
  • Penukaran Penuding Tidak Selamat (Tidak Selamat): Ini teknik memintas sistem jenis dan membenarkan penukaran terus menggunakan pakej yang tidak selamat, tetapi ia harus digunakan dengan berhati-hati.
value := []string{"a", "b", "c"}
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menukar Secara Terus Antara Kepingan Pelbagai Jenis dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan