[解決済み] golangでリーズナブルなスタック実装をお探しですか?
2022-03-11 22:26:10
質問
今のところ、私の素朴なアプローチは
type stack []int
func (s *stack) Push(v int) {
*s = append(*s, v)
}
func (s *stack) Pop() int {
res:=(*s)[len(*s)-1]
*s=(*s)[:len(*s)-1]
return res
}
動作する プレイグラウンド しかし、見た目が悪く、参照外しが多すぎる。もっといい方法はないでしょうか?
どのように解決するのですか?
スタイルと個人の好みの問題です。 あなたのコードで大丈夫です (スレッドセーフでないことと、空のスタックからポップするとパニックになることは別として)。これを少し単純化すると、バリューメソッドで作業してスタック自体を返すことができ、よりエレガントになります。 好みによりますが ... すなわち
type stack []int
func (s stack) Push(v int) stack {
return append(s, v)
}
func (s stack) Pop() (stack, int) {
// FIXME: What do we do if the stack is empty, though?
l := len(s)
return s[:l-1], s[l-1]
}
func main(){
s := make(stack,0)
s = s.Push(1)
s = s.Push(2)
s = s.Push(3)
s, p := s.Pop()
fmt.Println(p)
}
もう一つの方法は、構造体でラップすることで、レースコンディションを避けるためにミューテックスを簡単に追加することなどもできます。
type stack struct {
lock sync.Mutex // you don't have to do this if you don't want thread safety
s []int
}
func NewStack() *stack {
return &stack {sync.Mutex{}, make([]int,0), }
}
func (s *stack) Push(v int) {
s.lock.Lock()
defer s.lock.Unlock()
s.s = append(s.s, v)
}
func (s *stack) Pop() (int, error) {
s.lock.Lock()
defer s.lock.Unlock()
l := len(s.s)
if l == 0 {
return 0, errors.New("Empty Stack")
}
res := s.s[l-1]
s.s = s.s[:l-1]
return res, nil
}
func main(){
s := NewStack()
s.Push(1)
s.Push(2)
s.Push(3)
fmt.Println(s.Pop())
fmt.Println(s.Pop())
fmt.Println(s.Pop())
}
関連
-
[解決済み] GO言語:致命的なエラー:すべてのゴルーチンがスリープしている - デッドロック
-
[解決済み] GoのHTTP基本認証
-
Solve golang compile prompt dial tcp 172.217.160.113:443: connectex: 接続の試行に失敗しました
-
[解決済み] Goでfloat64をintに変換する
-
[解決済み] go get を使って特定のバージョンのパッケージをインポートするにはどうすればよいですか?
-
[解決済み] golangでリーズナブルなスタック実装をお探しですか?
-
[解決済み】Goのタグはどのような用途に使われますか?
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】Goの構造体のスタックとヒープ割り当て、およびガベージコレクションとの関連性
-
[解決済み] Goで*int64をリテラルにするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Go モジュールのローカル リポジトリとして Artifactory を使用する方法
-
[解決済み] GO言語:致命的なエラー:すべてのゴルーチンがスリープしている - デッドロック
-
[解決済み] Go: パニック: ランタイム エラー: 無効なメモリ アドレスまたは nil ポインタのデリファレンス
-
[解決済み] SETNXでシングルインスタンスのRedisをロックする
-
[解決済み] go getとgo installの違いは何ですか?
-
[解決済み] Goで部分文字列を抽出する
-
[解決済み] Golangで定数mapを宣言するには?
-
[解決済み】現在実行中のファイルのディレクトリを取得するには?
-
[解決済み】なぜmake()やnew()をするのでしょうか?)
-
[解決済み】インターフェースのスライスを変換するタイプ