结构体有两种方式作为返回值
代码
package main
import (
"fmt"
)
type SS struct {
Name string
Age int
}
func getInfo() (*SS) {
var ac = SS{}
ac.Age = 1
return &ac
}
func getInfo1() (aa *SS) {
aa.Age = 1
return
}
func getInfo2() (SS) {
var ac = SS{}
ac.Age = 1
return ac
}
func getInfo3(ac *SS) {
var ac = SS{}
ac.Age = 1
return
}
func main() {
//var dd *SS
//var dd = &SS{}
var dc = &SS{}
dc = getInfo()
fmt.Println(dc.Age)
var df = SS{}
df = getInfo2()
fmt.Println(df.Age)
var de = &SS{}
getInfo3(de)
fmt.Println(de.Age)
var dd = &SS{}
dd = getInfo1()
fmt.Println(dd.Age)
}
结果:
1
1
1
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x47ae8f]
goroutine 1 [running]:
main.getInfo1(...)
/home/zhaoky/Desktop/kaiyue/aa/f.go:19
main.main()
/home/zhaoky/Desktop/kaiyue/aa/f.go:41 +0xaf
分析
1、getinfo() 结构体指针 需要在返回的结构体在函数外有实体
2、getinfo1() 结构体指针 即使在函数外有实体也会报错崩溃,是因为此时给返回的结构体指针声明了一个结构体指针,但这个结构体指针没有实体,在赋值时会报错
3、getinfo2() 结构体作为返回值 外层可以有实体也可以没有