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
Linda Hamiltonasal
2024-12-03 14:36:12776semak imbas

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)
}

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

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

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)

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!

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