Go 泛型玩出花,详解新提案 switch type!

大家好,我是煎鱼。 前面写过好几篇 Go 泛型的语法、案例介绍,新的一手 Go 消息。实际上,随着一些提案被接受,新的提案也逐渐冒出。 这不,我发现有了泛型后,大家可以更进一步玩出花来了。看到了一个 ”新“ 提案《proposal: spec: generics: type switch on parametric types》,讲的就是增加泛型后的参数类型上的类型开关诉求。 跟着煎鱼一起掌握新的 Go 知识吧! 新提案 新的提案内容是希望增加一个新的变种语句,允许在 switch 语句中使用泛型时,能够进一步便捷的约束其类型参数。 例如: switch type T { case A1: case A2, A3: .

Go 为什么不支持类和继承?

大家好,我是煎鱼。 大家在早期学习 Go 时,一旦跨过语法的阶段后。马上就会进入到一个新的纠结点,Go 不支持面向对象吗? 这门编程语言里没有类(class)、继承(extends),没法一把搜了,面试问啥面向对象(OOP)? 今天煎鱼就带大家一起来了解这之中的思考,Go 真的不支持吗? 类和继承 类是什么 类(class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的特性和方法(via @维基百科)。 例子如下: class SimpleClass { // 声明属性 public $var = '脑子进煎鱼了'; // 声明方法 public function displayVar() { echo $this->var; } } 每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。

Go 新关键字 any,interface 会成历史吗?

大家好,我是煎鱼。 大家在看 Go1.18 泛型的代码时,不知道是否有留意到一个新的关键字 any。 例子如下: func Print[T any](s []T) {} 之前没有专门提过,但有没有小伙伴以为这个关键字,是泛型代码专属的? 其实不是…在这次新的 Go1.18 更新中,any 是作为一个新的关键字出现,any 有一个真身,本质上是 interface{} 的别名: type any = interface{} 也就是,在常规代码中,也可以直接使用: func f(a any) { switch a.(type) { case int: fmt.

Rust 内讧,PHP 主力淡出?Go:好好放假

大家好,我是煎鱼。 现在已经是 2021 年的 Q4 季度了,许多职场人都忙的飞起,被 PPT 各种轰炸。 在上周,看到几门语言的社区都发生了一些大事,煎鱼表示大受震撼,来说几句我的看法。 PHP 主力淡出 在 11 月 23 日,看到 PHP 的主力开发 Nikita Popov 在论坛上发文宣布将不再以专业身份从事 PHP 工作,投入到 PHP 开发中的时间将会大幅度减少。 根据 Jetbrains 分享的消息来看,可得知 Nikita Popov 在高中(2011 年)时就开始参与 PHP 开发,截止现在已有 10 年经验了。

Go 新语法挺丑?最新的泛型类型约束介绍

大家好,我是煎鱼。 近期我们在分享《3 件与 Go 开发者有关的大小事》时,里面有一部分有提到 Go 泛型的约束类型语法又又又变了。 在评论区里看到不少的读者朋友大呼泛型的新类型约束语法挺丑,不如原本的好… 如下: 为此,今天煎鱼就带大家来看看,为什么会发生泛型的新语法会这种改变? 问题背景 原本 @Ian Lance Taylor 设计的的泛型类型关键字如下: type T interface { type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string } 看起来好像非常 “顺眼”。但在《proposal: Go 2: sum types using interface type lists》中社区进行了热烈的讨论。

泛型是双刃剑?Go1.18 编译会慢近 20%

大家好,我是煎鱼。 目前 Go 的泛型已经在稳定推进的过程,在 Go1.18 将会释出正式的第一版。不过前两天我看到 @danscales 提出的《cmd/compile: Go 1.18 compile time may be about 18% slower than Go.17 (largely from changes due to generics)》。 作者表示在 Go1.18 有了泛型后,编译速度将会变慢,虽然不意外,说明副作用还是有的,升级需谨慎。 以下为修整后概括的原文信息。 性能分析 这个测试主要是测试 Go 泛型对 Go 编译器带来的影响,并没有输入大量的测试用例,是最简单的比较,仅代表大部分的差异。

分享 Go 最近的几件周边大小事

大家好,我是煎鱼。 最近可能是因为 Q4 了,又恰逢 Go1.18 快要发布,各路 Go 语言的新消息层出不穷。 今天煎鱼带大家一起来了解下最近社区发生的几件大小事,当然,我只讲一些核心的内容。 Go 诞生 12 年 在 2021 年 11 月 10 日,是 Go 语言开源版本的 12 岁生日。Go 官方博客发表《Twelve Years of Go》。 主体内容分为三块介绍: 回顾过去一年的核心变更。 展望明年的特性计划。 介绍今年做的 Go 相关分享。 回顾过去 是对过去一年的版本更新进行说明:

Go 为什么不支持函数重载和参数默认值?

大家好,我是煎鱼。 大家在初学习 Go 语言时,带着其他语言的习惯,总是会有些不习惯,感觉非常不能理解,直打问号。 其中一点就是 Go 语言不支持函数重载和参数默认值,觉得使用起来很不方便。 为此,在这篇文章中煎鱼就和大家一起来了解为什么,有又会怎么样。 函数重载 函数重载(function overloading),也叫方法重载。是某些编程语言(如 C++、C#、Java、Swift、Kotlin 等)具有的一项特性。 该特性允许创建多个具有不同实现的同名函数,对重载函数的调用会运行其适用于调用上下文的具体实现。 从功能上来讲,就是允许一个函数调用根据上下文执行不同的方法,达到调用同一个函数名,执行不同的方法。 一个简单的例子: #include <iostream> int Volume(int s) { // 立方体的体积。 return s * s * s; } double Volume(double r, int h) { // 圆柱体的体积。 return 3.

回归现实:Go Leader 对 1.18 泛型的期望

大家好,我是煎鱼。 前段时间根据 Go 泛型的最新动态,我写了一篇《出泛型后 API 怎么办?Go 开发者要注意了》文章,引发了不少小伙伴的热议。 Go 核心开发团队的现任 Leader @Russ Cox 在 golang-dev 中正式发表《expectations for generics in Go 1.18》对 Go 泛型给出了 “期待”,可以认为是后续的计划了。 如果不出现严重的问题,Go 1.18 将会包括对泛型的支持,并且这次泛型的支持将会是有史以来最大的一次语言变化,对以下几点有顾虑: 最佳实践. 生产经验 兼容性承诺。 接下来,煎鱼带大家一起了解 Russ Cox 发表的 Go 泛型进程,知悉官方一手消息。

为什么 Go 不支持循环引用?

大家好,我是煎鱼。 近年来开始学习 Go 语言的开发者越来越多了。很多小伙伴在使用时,就会遇到种种不理解的问题。 其中一点就是循环引入的报错: package command-line-arguments imports github.com/eddycjy/awesome-project/a imports github.com/eddycjy/awesome-project/b imports github.com/eddycjy/awesome-project/a: import cycle not allowed 为什么 Go 不支持循环引用呢,这就很不解了,难道还影响性能了? 今天煎鱼将和大家一起了解背后的原因。 案例演示 做一个基本的案例 Demo,便于没接触过的同学建立初步认知。我们的程序分别有 2 个 package。 package a 的代码如下: