Как создать динамическое имя переменной путем объединения двух строк

Java всегда передает аргументы по значению NOT по ссылке.


Позвольте мне объяснить это с помощью примера :

public class Main{
     public static void main(String[] args){
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a){
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c){
          c.setAttribute("c");
     }
}

объясните это поэтапно:

  1. Объявление ссылки с именем f типа Foo и присвоение ее новому объекту типа Foo с атрибутом "f".
    Foo f = new Foo("f");
    
    enter image description here [/g1]
  2. Со стороны метода указывается ссылка типа Foo с именем a и изначально назначена null.
    public static void changeReference(Foo a)
    
    enter image description here [/g2]
  3. Когда вы вызываете метод changeReference, ссылка a будет назначена объекту, который передается в качестве аргумента.
    changeReference(f);
    
    enter image description here [/g3]
  4. Объявление ссылки с именем b типа Foo и присвоение ее новому объекту типа Foo с атрибутом "b".
    Foo b = new Foo("b");
    
    enter image description here [/g4]
  5. a = b переназначает ссылку a NOT f объекту, чей его атрибут "b". enter image description here [/g5]
  6. Как вы называете метод modifyReference(Foo c), для объекта с атрибутом "f" создается и назначается ссылка c. enter image description here [/g6]
  7. c.setAttribute("c"); изменит атрибут объекта, на который указывает ссылка c, и это тот же объект, на который указывает ссылка f. enter image description here [/g7]

Надеюсь, теперь вы понимаете, как объекты передачи в качестве аргументов работают в Java:)

1
задан Flimzy 20 January 2019 в 10:18
поделиться

1 ответ

Это не возможно в Go, так как это скомпилированный и статически типизированный язык. Компилятор должен знать во время компиляции имена и типы переменных (*). То, что вы спрашиваете, это именование переменных во время выполнения, которое не может работать. Тем не менее, крайне маловероятно, что вам это действительно нужно на практике. Карты могут предоставлять аналогичные возможности:

m := make(map[string]string)
m["key"] = "value"

И вы можете создать любой из них во время выполнения. Немного адаптируя ваш пример:

package main

import (
    "fmt"
    "strconv"
    "strings"
    "time"
)

func main() {
    m := make(map[string]string)
    currentMonth := time.Now().Month()
    currentYear := time.Now().Year()
    var month = int(currentMonth)
    var currentDate = strings.Join([]string{strconv.Itoa(currentYear), "-", strconv.Itoa(month)}, "")

    m["key"+currentDate] = "value"
    fmt.Println(m)
}

Распечатывает:

map[key2019-1:value]

(*) За некоторыми исключениями, которые не относятся к данному конкретному обсуждению.

0
ответ дан Eli Bendersky 20 January 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: