为何Rust中环境变量类型为String而非&str?
为什么Rust中读取环境变量返回String而非&str?
首先,
&'static str是编译时就嵌入二进制文件的静态字符串,它的内容、长度和生命周期都在编译阶段确定,完全绑定程序的整个运行周期。但环境变量是运行时从系统动态读取的,程序编译时根本无法预知它的内容、长度甚至是否存在,完全不匹配&'static str的适用场景。其次,系统环境变量的内存管理权不属于我们的程序,我们无法保证这块内存的稳定性。如果
env::var返回&str,这个引用会指向系统管控的内存区域,一旦系统后续修改或释放了这块内存,程序就会出现悬垂引用,直接违反Rust的内存安全规则。而返回String的话,相当于把环境变量的内容复制到了程序自身的堆内存中,我们完全拥有这块内存的控制权,不会有任何安全隐患。最后,虽然环境变量在程序启动后不会再变化,但从读取逻辑来看,
env::var需要处理动态获取的可变长度数据,String作为可增长的自有类型,能自然承接这种运行时动态分配的内存,完美适配不同长度的环境变量值。
对比示例:
编译时确定的静态字符串:
let url: &'static str = "yourUrl";
运行时读取的环境变量,必须用String持有:
use dotenv::dotenv; use std::env; dotenv().ok(); let api_key: String = env::var("Your_api_key").expect("API KEY NOT FOUND");
内容的提问来源于stack exchange,提问作者Yilmaz
相关产品推荐
相关产品推荐

