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

スライスから型を作成

王林
リリース: 2024-02-05 22:57:07
転載
834 人が閲覧しました

スライスから型を作成

#質問内容

スタックのようなデータ型を作成したいと考えています。 「上部」でエントリを追加および削除し、それらを印刷できるようにしたいと考えています。この例では、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート