Go语言中如何初始化指向指针的指针?结构体双指针字段初始化问题
嘿,我来帮你理清这两个Go语言里的双指针问题~
一、如何初始化指向指针的指针?
初始化**T类型的变量其实很直观,核心思路就是逐层取地址:
- 先定义一个基础值,比如一个结构体或者基础类型变量
- 对这个值取地址得到
*T类型的指针 - 再对这个指针取地址,就得到了
**T类型的双指针
举个具体的代码示例:
// 先定义一个基础结构体类型 type AppConfig struct { Env string } // 步骤1:创建基础值 config := AppConfig{Env: "development"} // 步骤2:获取指向基础值的指针 pConfig := &config // 步骤3:获取指向指针的指针 ppConfig := &pConfig // 现在ppConfig就是**AppConfig类型了
如果你想更紧凑一点,也可以用链式取地址的方式直接初始化(只适用于可寻址的字面量,比如结构体、数组字面量):
ppConfig := &&AppConfig{Env: "development"}
不过要注意,这种写法不能用于基础类型常量,比如&&5是不合法的,因为整数常量5是不可寻址的。
二、如何初始化带有双指针字段的结构体?
你遇到的invalid pointer type **basicAppConfig for composite literal错误,核心原因是:结构体复合字面量是用来创建「值」的,而双指针字段需要的是一个「指针值」——你不能直接用**basicAppConfig{...}这种写法来给字段赋值,因为Go不允许用复合字面量直接构造指针类型(更别说双指针了)。
假设你的结构体定义是这样的:
type basicAppConfig struct { Env string } type MyApp struct { Config **basicAppConfig // 双指针字段 }
错误写法(就是你尝试的那种):
// 报错:invalid pointer type **basicAppConfig for composite literal myApp := MyApp{ Config: **basicAppConfig{Env: "dev"}, }
正确的初始化方式
我们需要先构造出双指针值,再赋值给结构体字段,有几种方式:
方式1:逐层构造(可读性最好)
// 1. 创建基础配置值 config := basicAppConfig{Env: "dev"} // 2. 取地址得到单指针 pConfig := &config // 3. 再取地址得到双指针 ppConfig := &pConfig // 4. 初始化结构体 myApp := MyApp{Config: ppConfig}
方式2:链式取地址(更紧凑)
// 直接对结构体字面量的指针取地址,得到双指针 myApp := MyApp{ Config: &(&basicAppConfig{Env: "dev"}), }
这种写法是合法的,因为&basicAppConfig{...}创建了一个可寻址的结构体指针,我们可以对它再次取地址得到双指针。
方式3:使用new函数(适用于需要先置nil的场景)
如果你的双指针字段需要先指向nil,之后再给底层分配内存,可以用new函数:
// 创建一个**basicAppConfig类型的变量,底层的*basicAppConfig初始为nil ppConfig := new(*basicAppConfig) // 给底层指针分配实际的配置值 *ppConfig = &basicAppConfig{Env: "production"} // 初始化结构体 myApp := MyApp{Config: ppConfig}
为什么你的逻辑出错了?
你之前尝试直接用**basicAppConfig{...}来初始化字段,本质是混淆了「值的复合字面量」和「指针的创建方式」——复合字面量只能用来生成basicAppConfig这种值类型,而双指针需要通过对指针取地址或者new函数来创建,不能直接用字面量构造。
内容的提问来源于stack exchange,提问作者Stéphane
相关产品推荐
相关产品推荐

