面试题答案
一键面试1. 当param
为字面常量时
- 普通非泛型场景:在普通函数中,编译器可以根据字面常量的形式直接确定其具体类型。例如,
1
会被推导为int
类型,3.14
会被推导为float64
类型。 - 泛型函数场景:在泛型函数
genericFunc
中,当param
为字面常量时,类型推导会根据泛型类型参数T
来进行。如果在调用genericFunc
时明确指定了T
的类型,那么val
的类型就是指定的T
类型。例如,genericFunc[int](1)
,此时val
的类型为int
。如果没有明确指定T
的类型,Go编译器会尝试根据函数的使用上下文来推导T
的类型。比如,如果后续代码对val
进行了与int
类型相关的操作(如val + 1
),那么T
会被推导为int
,val
也为int
类型。
2. 当param
是一个由字面常量组成的切片时
- 普通非泛型场景:对于由字面常量组成的切片,其类型推导取决于切片内字面常量的类型。例如,
[]int{1, 2, 3}
,切片类型为[]int
,编译器根据内部常量1, 2, 3
的类型推导出整个切片为int
类型的切片。 - 泛型函数场景:在泛型函数
genericFunc
中,如果param
是由字面常量组成的切片,如genericFunc([]int{1, 2, 3})
,如果没有明确指定T
,编译器会根据切片内字面常量类型及函数上下文推导T
为[]int
,val
的类型也为[]int
。若明确指定T
,如genericFunc[[]float64]([]float64{1.1, 2.2})
,那么val
的类型就是[]float64
。