go的结构体作为返回值

结构体有两种方式作为返回值

  • 结构体
  • 结构体指针

代码

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() 结构体作为返回值 外层可以有实体也可以没有

你可能感兴趣的:(Go语言,golang,开发语言,后端)