Golang中如何返回结构体的指针
Golang中如何返回结构体的指针
func get_fs_info() *rtn {
type junk struct {
stuff
}
var rtn [20]junk
.
.
more stuff
.
.
return &rtn
}
为什么 Go 会报错说有一个未知变量 “rtn”?
4 回复
是的,它对于你代码中的每个函数都是已知的。如果你用大写字母开头命名它,它就是一个导出的结构体。
因为您必须返回一个类型(当然也可以返回一个命名变量)。所以将您的代码修改为:
func get_fs_info() *[20]junk
同时将以下内容从函数中移出:
type junk struct {
stuff
}
在 Go 语言中,你遇到的问题是由于变量作用域和类型定义冲突导致的。具体分析如下:
问题分析
在你的代码中:
- 函数声明返回类型为
*rtn - 在函数内部又定义了一个局部变量
rtn - 这导致了命名冲突
正确的代码示例
// 先定义结构体类型
type Rtn struct {
// 结构体字段
Value int
Name string
}
func getFsInfo() *Rtn {
// 创建结构体实例
rtn := Rtn{
Value: 10,
Name: "example",
}
// 返回结构体指针
return &rtn
}
或者使用 new() 函数:
func getFsInfo() *Rtn {
rtn := new(Rtn)
rtn.Value = 20
rtn.Name = "new example"
return rtn
}
修复你的原始代码
// 定义结构体类型(在函数外部或内部)
type MyStruct struct {
// 字段定义
Data string
}
func getFsInfo() *MyStruct {
// 创建数组(注意:这里返回的是数组指针,不是单个结构体指针)
var rtn [20]MyStruct
// 初始化数组元素
for i := 0; i < len(rtn); i++ {
rtn[i].Data = fmt.Sprintf("Item %d", i)
}
// 返回数组指针
return &rtn
}
关键点说明
- 类型定义:结构体类型需要先定义
- 命名冲突:避免使用相同的名称作为类型名和变量名
- 返回指针:使用
&操作符获取变量的地址 - 数组指针:返回数组指针时,类型应为
*[20]MyStruct
更常见的单结构体指针返回
type FileInfo struct {
Name string
Size int64
Modified time.Time
}
func getFileInfo() *FileInfo {
info := FileInfo{
Name: "example.txt",
Size: 1024,
Modified: time.Now(),
}
return &info
}
// 使用示例
func main() {
info := getFileInfo()
fmt.Printf("文件名: %s, 大小: %d 字节\n", info.Name, info.Size)
}
在你的原始代码中,Go 编译器将 rtn 解释为返回类型,但在函数内部又遇到了同名的变量定义,因此报告 “unknown variable rtn” 错误。通过分离类型定义和变量声明可以解决这个问题。

