Sabit harita nasıl beyan edilir


126

Go'da sabit ilan etmeye çalışıyorum ama bir hata veriyor. Biri lütfen Go'da bir sabit beyan etme sözdizimi konusunda bana yardım edebilir mi?

Bu benim kodum:

const romanNumeralDict map[int]string = {
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}

Bu hata

# command-line-arguments
./Roman_Numerals.go:9: syntax error: unexpected {

Yanıtlar:


154

Sözdiziminiz yanlış. Değişmez bir harita yapmak için (sözde sabit olarak) şunları yapabilirsiniz:

var romanNumeralDict = map[int]string{
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}

A'nın içinde funcşu şekilde ilan edebilirsiniz:

romanNumeralDict := map[int]string{
...

Ve Go'da sabit harita diye bir şey yoktur. Daha fazla bilgiyi burada bulabilirsiniz .

Go oyun alanında deneyin.


1
Bu non-declaration statement outside function bodyaslında derleme zamanında bir atar . Nasıl olur?
alediaferia

@AlessandroDiaferia Böyle bir hata almıyorum. Nasıl kullanıyorsun
squiguy

7
@AlessandroDiaferia var romanNumeralDict map[int]string = map[int]string{...}böyle bir durumda deneyin .
B-Scan

4
@alediaferia :=, bir işlevin dışında kullanıyorsanız bu hatayı alırsınız .
Jeffrey Martinez

1
"Sözde sabit" nedir?
Garrett

23

Sabitleri birçok farklı şekilde oluşturabilirsiniz:

const myString = "hello"
const pi = 3.14 // untyped constant
const life int = 42 // typed constant (can use only with ints)

Ayrıca bir enum sabiti de oluşturabilirsiniz:

const ( 
   First = 1
   Second = 2
   Third = 4
)

Haritaların, dizilerin sabitlerini oluşturamazsınız ve etkili go :

Go'daki sabitler sadece budur - sabittir. İşlevlerde yerel olarak tanımlansalar bile derleme zamanında oluşturulurlar ve yalnızca sayılar, karakterler (runlar), dizeler veya booleler olabilirler. Derleme zamanı kısıtlaması nedeniyle, onları tanımlayan ifadelerin derleyici tarafından değerlendirilebilen sabit ifadeler olması gerekir. Örneğin, 1 << 3 sabit bir ifadedir, oysa math.Sin (math.Pi / 4), math.Sin işlevinin çalışma zamanında olması gerektiği için değildir.


bu yüzden daha çok bir C ++ 11 constexpr gibi ... o zaman neden math.Sin bir constexpr işlevi değil!
Francesco Dondi

İfadeleriniz doğrudur, ancak soru sabit bir harita oluşturmakla ilgiliydi.
jzer7

5
@ jzer7 cevabımın neden alakasız olduğunu açıklar mısınız? Bir şeyin nasıl yaratılacağını sordu, bunun mümkün olmadığını söyledim. Neyin mümkün olduğunu açıkladı ve belgelerden alıntı yaptı ve istediğini yapmanın tam olarak neden mümkün olmadığını söyledi.
Salvador Dali

12

Kapanışı olan bir haritayı taklit edebilirsiniz:

package main

import (
    "fmt"
)

// http://stackoverflow.com/a/27457144/10278

func romanNumeralDict() func(int) string {
    // innerMap is captured in the closure returned below
    innerMap := map[int]string{
        1000: "M",
        900:  "CM",
        500:  "D",
        400:  "CD",
        100:  "C",
        90:   "XC",
        50:   "L",
        40:   "XL",
        10:   "X",
        9:    "IX",
        5:    "V",
        4:    "IV",
        1:    "I",
    }

    return func(key int) string {
        return innerMap[key]
    }
}

func main() {
    fmt.Println(romanNumeralDict()(10))
    fmt.Println(romanNumeralDict()(100))

    dict := romanNumeralDict()
    fmt.Println(dict(400))
}

Go oyun alanında deneyin


4
(TestMostSoldRecommender?)
twotwotwo

1
Aslında olası bir çözümdür. Bununla birlikte, yazar hiçbir şeyi açıklamadığından (ve her şeyi garip bir şekilde adlandırılmış bir test vakasının içine koyduğundan), yanıt yanlış görünüyor. Mantık şu şekildedir: (1) Anonim bir işlev oluşturun (2) Anonim işlev, map(3) anonim işlev "bir int kabul eden ve bir dizge döndüren bir işlev" döndürür (4) Döndürülen işlev int -> dizesini yapar map(5) kullanarak eşleme Anonim işlevi hemen çalıştırın ve döndürülen işlevi bir değişkene atayın. Bu değişken bir fonksiyon gibi kullanılabilir ve etki bir harita gibidir.
Siu Ching Pong -Asuka Kenji-

3

Ve yukarıda Siu Ching Pong -Asuka Kenji tarafından önerildiği gibi , bana göre daha mantıklı olan ve işlev sarmalayıcı olmadan size harita türünün rahatlığını bırakan işlevle:

   // romanNumeralDict returns map[int]string dictionary, since the return
       // value is always the same it gives the pseudo-constant output, which
       // can be referred to in the same map-alike fashion.
       var romanNumeralDict = func() map[int]string { return map[int]string {
            1000: "M",
            900:  "CM",
            500:  "D",
            400:  "CD",
            100:  "C",
            90:   "XC",
            50:   "L",
            40:   "XL",
            10:   "X",
            9:    "IX",
            5:    "V",
            4:    "IV",
            1:    "I",
          }
        }

        func printRoman(key int) {
          fmt.Println(romanNumeralDict()[key])
        }

        func printKeyN(key, n int) {
          fmt.Println(strings.Repeat(romanNumeralDict()[key], n))
        }

        func main() {
          printRoman(1000)
          printRoman(50)
          printKeyN(10, 3)
        }

Bunu play.golang.org adresinde deneyin.


-2

Yukarıda belirtildiği gibi bir haritayı sabit olarak tanımlamak mümkün değildir. Ancak, harita içeren bir yapı olan global bir değişken tanımlayabilirsiniz.

Başlatma şu şekilde görünecektir:

var romanNumeralDict = struct {
    m map[int]string
}{m: map[int]string {
    1000: "M",
    900: "CM",
    //YOUR VALUES HERE
}}

func main() {
    d := 1000
    fmt.Printf("Value of Key (%d): %s", d, romanNumeralDict.m[1000])
}

3
Neden haritayı sadece global değişken yapmıyoruz? Neden yapıya sarılsın?
kasırga Hamilton

3
Bu haritayı sabit yapmaz, yine de yapabilirsinizromanNumeralDict.m[1000] = "New value"
brando
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.