(ns myapp.core
(:require
[clojure.core.async :refer [>! <! >!! <!! chan go-loop]])
(:gen-class))
(def this-ns *ns*)
(defn get-ns [c0]
(go-loop []
(let [x (<! c0)]
(println (str "this ns -> " this-ns))
(println (str "go block ns -> " *ns*)))
(recur)))
(defn -main [& args]
(let [c0 (chan)]
(get-ns c0)
(>!! c0 1)))
Run Code Online (Sandbox Code Playgroud)
输出:
this ns -> myapp.core
go block ns -> user
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么名称空间在go块内是不同的?
我不认为这与此有关core.async.它只是如何*ns*工作 - 它包含当前repls当前命名空间
clojure.core/*ns*
A clojure.lang.Namespace object representing the current namespace.
Run Code Online (Sandbox Code Playgroud)
换句话说,*ns*取决于您调用的命名空间
例:
; <current-ns>=> <code>
user=> (load-file "yourcode.clj")
#'myapp.core/-main
user=> (myapp.core/-main)
this ns -> myapp.core
go block ns -> user
true
user=> (in-ns 'myapp.core) ; <-- switching namespace
#object[clojure.lang.Namespace 0x679e26fe "myapp.core"]
myapp.core=> (-main)
this ns -> myapp.core
go block ns -> myapp.core
true
Run Code Online (Sandbox Code Playgroud)