Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Buat jenis daripada slice

Buat jenis daripada slice

王林
王林ke hadapan
2024-02-05 22:57:07712semak imbas

Buat jenis daripada slice

Kandungan soalan

Saya mahu mencipta jenis data seperti tindanan. Saya mahu menambah dan mengalih keluar masukan "di bahagian atas" dan boleh mencetaknya. Dalam contoh ini, jenis xpath digunakan untuk melintasi dokumen xml dan menjejaki laluan semasa.

Jadi saya mencipta xpath[]jenis rentetan dan menulis fungsi yang sepadan, iaitu: push() pop() dan string().

Masalah saya ialah jenis itu hilang keadaannya, yang agak mengelirukan saya kerana saya fikir kepingan adalah jenis rujukan. Juga, jika saya cuba menukar fungsi kepada penerima penunjuk, saya mendapat beberapa ralat kompilasi. Untuk membetulkannya pada ketika ini, saya hanya menukar [] rentetan kepada struct dengan medan rentetan [] tunggal. Walaupun ia masih mengganggu saya bahawa saya tidak dapat membuatnya berfungsi dengan hanya menggunakan slice sebagai jenis asas.

Apakah pendekatan yang betul?

package main

import (
    "fmt"
    "strings"
)

type xPath []string

func (xp xPath) push(entry string) {
    xp = append(xp, entry)
}

func (xp xPath) String() string {
    sb := strings.Builder{}
    sb.WriteString("/")
    sb.WriteString(strings.Join(xp, "/"))
    return sb.String()
}

func main() {
    xp := xPath{}
    xp.push("rss")
    xp.push("channel")
    xp.push("items")
    fmt.Println(xp)

    // Output: /
    // Wanted: /rss/channel/items
}

Jawapan betul


Fungsi tolak anda tidak melakukan apa-apa.

Fungsi tolak yang betul:

func (xp *xPath) push(entry string) {
    *xp = append(*xp, entry)
}

Sepotong ialah jenis rujukan dalam situasi di mana anda ingin menukar nilainya (cth. menggunakan indeks).

Sebaliknya, jika anda ingin mengagihkannya semula dan menggantikan keseluruhan kepingan, anda harus menggunakan penunjuk.

Mengenai tindanan, terdapat beberapa cara yang lebih baik: Semak soalan ini.

Atas ialah kandungan terperinci Buat jenis daripada slice. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam