Golang函数返回值少用对象

Posted 玩家_名狱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang函数返回值少用对象相关的知识,希望对你有一定的参考价值。

口号

提倡面向接口编程

代码问题抛出

为了返回一个对象给业务调用里面的方法,写了一个Newmysql函数返回这个对象,大家帮我看看有没有问题

package main

import "fmt"

type Dao interface 
	SelectData()


type MySQL struct

func (m MySQL) SelectData() 
	return


func NewMySQL() *MySQL 
	// 假设一些异常导致返回nil
	return nil


func main() 
	var result Dao = NewMySQL()
	if result != nil 
		fmt.Printf("值为:%v,类型为:%T", result, result)
	 else 
		fmt.Println("为nil啊")
	


/*
结果为:
值为:<nil>,类型为:*main.MySQL
*/

NewMySQL()不是返回nil吗?为什么result不为nil?

1、首先,nil是什么?

// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

官方文档是这样定义的,它是一个零值的占位,他可以表示:pointer, channel, func, interface, map, 或者 slice 类型

2、然后要知道一个东西,interface包含类型和值,只有类型和值都为空时,这个interface才等于nil。只有值为nil,但是类型不为nil时,这个interface是不等于nil的。

问题原理

NewMySQL()内部返回nil,但实际上这份方法定义了返回一个结构体指针,类型是结构体,值是指针,nil只是填充了值,类型依旧是*main.MySQL类型。然后把这个返回值赋给Dao接口,同样的,这个Dao接口类型没有变,只是值为nil。所以在判断是否为nil时,由于类型不为nil,导致判断结果不为nil。

解决方法

NewMySQL方法返回接口类型,而不是结构体或者结构体指针类型

func NewMySQL() Dao 
	// 假设一些异常导致返回nil
	return nil

这样的话nil赋值给接口的时候,这个接口的类型和值都为nil

以上是关于Golang函数返回值少用对象的主要内容,如果未能解决你的问题,请参考以下文章

Golang函数返回值少用对象

Golang方法和接口

TypeScript,接口(Interfaces),对象、数组和函数的类型

GoLang接口---下

Golang通脉之接口

golang 接口