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");
}
}
объясните это поэтапно:
f
типа Foo
и присвоение ее новому объекту типа Foo
с атрибутом "f"
. Foo f = new Foo("f");
[/g1] Foo
с именем a
и изначально назначена null
. public static void changeReference(Foo a)
[/g2] changeReference
, ссылка a
будет назначена объекту, который передается в качестве аргумента. changeReference(f);
[/g3] b
типа Foo
и присвоение ее новому объекту типа Foo
с атрибутом "b"
. Foo b = new Foo("b");
[/g4] a = b
переназначает ссылку a
NOT f
объекту, чей его атрибут "b"
. [/g5] modifyReference(Foo c)
, для объекта с атрибутом "f"
создается и назначается ссылка c
. [/g6] c.setAttribute("c");
изменит атрибут объекта, на который указывает ссылка c
, и это тот же объект, на который указывает ссылка f
. [/g7] Надеюсь, теперь вы понимаете, как объекты передачи в качестве аргументов работают в Java:)
Это не возможно в 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]
(*) За некоторыми исключениями, которые не относятся к данному конкретному обсуждению.