package main import "fmt" type someStruct struct{} func test() any { var t *someStruct = nil // 重要提醒:函数声明了返回值数据类型为空接口any,但实际返回的却是*someStruct,这时就会发生数据类型转换(*someStruct转 // 为any),注意这不是隐式转换,Go语言里没有隐式转换,声明了返回any就肯定是返回any,所以属于显式转换。 return t } func main() { p := test() // var p any = test() if p == nil { fmt.Println("p is nil") } else { fmt.Println("p is not nil") // p is not nil fmt.Printf("p = %+v \n", p) // p = <nil> } }
package main import "fmt" type someStruct struct{} func main() { var t *someStruct = nil p := t // var p *someStruct = t if p == nil { fmt.Println("p is nil") // p is nil } else { fmt.Println("p is not nil") fmt.Printf("p = %+v \n", p) } }
package main import ( "fmt" "reflect" ) type someStruct struct{} func test() any { var t *someStruct = nil return t } func main() { p := test() reflectType := reflect.TypeOf(p) reflectTypeKind := reflectType.Kind() reflectTypeKindString := reflectTypeKind.String() fmt.Printf("reflectType = %+v \n", reflectType) // reflectType = *main.someStruct fmt.Printf("reflectTypeKind = %+v \n", reflectTypeKind) // reflectTypeKind = ptr fmt.Printf("reflectTypeKindString = %+v \n", reflectTypeKindString) // reflectTypeKindString = ptr reflectValue := reflect.ValueOf(p) reflectValueKind := reflectValue.Kind() reflectValueKindString := reflectValueKind.String() fmt.Printf("reflectValue = %+v \n", reflectValue) // reflectValue = <nil> fmt.Printf("reflectValueKind = %+v \n", reflectValueKind) // reflectValueKind = ptr fmt.Printf("reflectValueKindString = %+v \n", reflectValueKindString) // reflectValueKindString = ptr reflectValueElem := reflectValue.Elem() fmt.Printf("reflectValueElem = %+v \n", reflectValueElem) // reflectValueElem = <invalid reflect.Value> reflectValueElemKind := reflectValueElem.Kind() fmt.Printf("reflectValueElemKind = %+v \n", reflectValueElemKind) // reflectValueElemKind = invalid }
Copyright © 2024 码农人生. All Rights Reserved