我正在尝试在我的服务启动时从系统环境加载密码和敏感数据。我尝试了多种不同的方法,但似乎无法找到在 Rust 中执行此操作的正确方法。
const PASSWORD: String = var("PASSWORD").unwrap();
不起作用,因为常量中的方法调用仅限于常量固有方法
。这同样适用于 static
(除了错误说静态,显然)。
我见过的另一种方法是
const PASSWORD: &'static str = env!("PASSWORD");
但问题是它将在编译时定义为 env!
是一个宏(至少我的理解是这样)。
我还考虑过将对 var("...").unwrap()
的调用简单地包装在一个函数中,但该解决方案并不适合我,而且还允许在整个运行时更改值并且在服务启动时不验证它们。
如您所知,我是 Rust 的新手。如果在您的回答中您不仅可以解释如何在运行时加载 const/static,还可以解释为什么我所做的是愚蠢和错误的,我将不胜感激 :)
最佳答案
const
和 static
在 Rust 中扮演不同的角色。
const
不仅表示一个常量,它还表示一个编译时常量,一个在编译时确定并刻在程序的只读存储器中的值程序。它不适合您的用例。
static
表示全局变量,其生命周期将跨越整个程序。它可能是可变的,在这种情况下它必须是 Sync
以避免并发修改。 static
变量必须从常量初始化,以便在程序开始时可用。
那么,如何在运行时读取变量并使其可用?好吧,一个干净的解决方案是完全避免全局...
...但是因为它很方便,所以有一个箱子:lazy_static!
.
use std::env::var;
use lazy_static::lazy_static;
lazy_static! {
static ref PASSWORD: String = var("PASSWORD").unwrap();
}
fn main() {
println!("{:?}", *PASSWORD);
}
在第一次访问变量时,执行表达式以加载它的值,然后该值被内存并可用,直到程序结束。
关于static - 在 Rust 中运行时使用环境变量填充静态/常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37405835/