Golang:如何对传入方法的interface{}类型指针进行解引用
解决Go中interface{}接收字符串指针后解引用判断为空的问题
直接给两种可行的实现方式,均针对你明确传入参数为字符串指针的场景:
方法一:类型断言(推荐,性能更优)
把interface{}直接断言为*string类型,解引用后就能拿到字符串值进行判断:
import ( "fmt" ) func main() { var v = "" fmt.Println(isEmptyString(&v)) // 输出true var v2 = "hello" fmt.Println(isEmptyString(&v2)) // 输出false } func isEmptyString(val interface{}) bool { // 断言为字符串指针类型 strPtr := val.(*string) // 解引用后判断是否为空字符串 return *strPtr == "" }
如果需要做安全校验(防止传入非*string类型参数),可以用带ok的断言:
func isEmptyString(val interface{}) bool { strPtr, ok := val.(*string) if !ok { // 根据业务需求处理,比如返回false或触发panic return false } return *strPtr == "" }
方法二:使用reflect包
你之前用reflect未成功,大概率是没正确获取指针指向的元素。正确写法需要用Elem()方法拿到指针指向的值:
import ( "fmt" "reflect" ) func main() { var v = "" fmt.Println(isEmptyString(&v)) } func isEmptyString(val interface{}) bool { rv := reflect.ValueOf(val) // 获取指针指向的元素值,再转为string类型 strVal := rv.Elem().String() return strVal == "" }
注意:如果传入的不是指针类型,Elem()会触发panic,若不确定输入类型,建议先通过rv.Kind() == reflect.Ptr做类型校验。
内容的提问来源于stack exchange,提问作者4reeman
相关产品推荐
相关产品推荐

