ホームページ  >  記事  >  バックエンド開発  >  スライスから型を作成

スライスから型を作成

王林
王林転載
2024-02-05 22:57:07747ブラウズ

スライスから型を作成

#質問内容

スタックのようなデータ型を作成したいと考えています。 「上部」でエントリを追加および削除し、それらを印刷できるようにしたいと考えています。この例では、xpath タイプを使用して xml ドキュメントを走査し、現在のパスを追跡します。

そこで、xpath[]string 型を作成し、対応する関数、つまり、push()、pop()、および string() を作成しました。

私の問題は、型がその状態を失うことです。スライスは参照型だと思っていたので、少し混乱しています。また、関数をポインター レシーバーに変更しようとすると、いくつかのコンパイル エラーが発生します。この時点でこれを修正するために、[]string を単一の []string フィールドを持つ構造体に変更しました。ただし、基本タイプとしてスライスだけを使用して機能させることができないのはまだ気になります。

正しいアプローチは何ですか?

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
}


正解


プッシュ関数は何も行っていません。

正しいプッシュ機能:

リーリー

スライスは、値を変更したい状況 (インデックスの使用など) における参照タイプです。

一方、それらを再割り当てしてスライス全体を置き換える場合は、ポインタを使用する必要があります。

スタックに関しては、もっと良い方法がいくつかあります。

この質問を見てください。

以上がスライスから型を作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。