MST

星途 面试题库

面试题:Go中字面常量类型推导在泛型场景下的应用

假设你正在使用Go 1.18及以上版本的泛型特性,有如下代码:`func genericFunc[T any](param T) { var val = param; // 这里val的类型推导和普通场景有何不同? }`,请阐述在泛型函数中,当参数`param`为字面常量时,`val`的类型推导规则与普通非泛型场景下有哪些区别和联系。如果`param`是一个由字面常量组成的切片,又该如何分析类型推导?
16.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

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会被推导为intval也为int类型。

2. 当param是一个由字面常量组成的切片时

  • 普通非泛型场景:对于由字面常量组成的切片,其类型推导取决于切片内字面常量的类型。例如,[]int{1, 2, 3},切片类型为[]int,编译器根据内部常量1, 2, 3的类型推导出整个切片为int类型的切片。
  • 泛型函数场景:在泛型函数genericFunc中,如果param是由字面常量组成的切片,如genericFunc([]int{1, 2, 3}),如果没有明确指定T,编译器会根据切片内字面常量类型及函数上下文推导T[]intval的类型也为[]int。若明确指定T,如genericFunc[[]float64]([]float64{1.1, 2.2}),那么val的类型就是[]float64