网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
…
case fmt.Stringer:
…
}
}
复制代码
类型 S 能够支持 string 和 fmt.Stringer 类型,case 配套对应实现。
案例二:近似元素
type Constraint interface {
~int | ~int8 | ~string
}
func ThisSyntax[T Constraint]( “T Constraint”) {
switch type T {
case ~int | ~int8:
…
case ~string:
…
}
}
func IsClearerThanThisSyntax[T Constraint]( “T Constraint”) {
switch type T {
case interface{~int | ~int8 }:
…
case interface{ ~string }:
…
}
}
复制代码
类型 T 可能有很多类型,程序中用到了近似元素,也就是基础类型是 int、int8、string,这些类型中的任何一种都能够满足这个约束。
为此,switch-type 支持了,case 也要配套支持该特性。
争议点
看到这里可能大家也想到了,这个味道很似曾相识,好像某个语法能够支持。因此,这个提案下最有争议的,就是与原有的类型断言的重复。
原有的类型断言如下:
switch T.(type) {
case string:
…
default:
…
}
复制代码
新的类型判别如下:
switch type T {
case A1:
case A2, A3:
…
}
复制代码
这么咋一看,其实类型断言的完全可以取代新的,那岂不是重复建设,造轮子了?
其实是没有完全取代的。差异点如下:
type ApproxString interface { ~string }
func F[T ApproxString](v T “T ApproxString”) {
switch (interface{})(v).(type) {
case string:
fmt.Println(v)
default:
panic(“脑子没进煎鱼”)
}
}
type MyString string
func main() {
F(MyString(“脑子进煎鱼了”))
}
复制代码
看出来差别在哪了吗,答案是什么?
答案是:会抛出恐慌(panic)。
你可能纠结了,问题出在哪里?这传入的 ”脑子进煎鱼了“ 的类型是 MyString
,他的基础类型是 string
类型,也满足 ApproxString
类型的近似类型 ~string
的要求,怎么就不行了…
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
94024)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新