最受不了的就是 golang 中的 if...else 语句了

242 天前
 zhwguest

代码密度太低了,经常要这么写:

1: var val string
2: if ok {
3:	val = "okay"
4: } else {
5:	val = "fail"
6: }

即使优化一下,还有:

1: val := okay
2: if !ok {
3:	val = "fail"
4: }

要是 kotlin,swift, java, c++, c ,来得多快啊,尤其很多个这种条件初始赋值的时候,看版面,就像在搞笑似的。

9442 次点击
所在节点    Go 编程语言
92 条回复
seth19960929
241 天前
@sagaxu When 场景就是二值取一, 想要短路效果就用 false && fn(), 如果既想又要貌似没看到有对应的代码段
fioncat
241 天前
你需要 rust

let val = if ok { "okay" } else { "fail" };
nxcdJaNnmyF9O90X
241 天前
脑子有坑吧 这也来黑 用不惯回去用抹脚布
uds9u32br
241 天前
@crayygy 你这么一说确实,还有嵌套的情况,那还是别加了吧
funnyecho
241 天前
看评论才直到,op 想要个三目?

我觉得优化后的那个版本已经很好了(初始化和条件分支要挨在一起)。后面加分支,那都是随手的事。
me1onsoda
241 天前
写的恶心看的舒服
x1aoYao
241 天前
@xingjue 大家都在讨论只有你在喷。怎么你的脑子和 Go 一样有坑还是大道至简了?
aababc
241 天前
@ryalu #49 怎么这么老长的代码
x1aoYao
241 天前
尤其是在子作用域,返回多值的函数,只有其中一个想赋值修改外层的变量,其余的初始化
就只能提前定义其余变量,否则直接:=外层的变量就不是被修改而是遮盖了。Go 没有元组,这个就很别扭。
zhady009
241 天前
@Rehtt 这跟写的人有关系跟语言关系不太大,就像上面发的代码一样。而且太多技术性代码在业务代码里反而读起来没那么好一眼看出主体逻辑
yazinnnn0
241 天前
换家不用写 go 的单位吧
faimin
241 天前
特性少也有好处,这样可以少一些炫技的骚操作,大家写出来的代码就都一样了,维护起来也方便😄
zxjxzj9
241 天前
恰恰相反最喜欢 go 这种干掉三目运算符的做法。。。 确实不容易看花眼,多写几行没事的,特别是现在很多都是 ai 写的了
zhaoahui
241 天前
Go 就图一个简单
iyaozhen
241 天前
没懂,其它语言 if else 不这样写?楼主举个例子呢?

还是想要三目运算符?

但这就是 go 的设计特性,语言的简洁。三目最大的问题是可以无限嵌套,看起来很麻烦
xiaocaiji111
241 天前
@kandaakihito 我们业务用了,后面业务复杂起来,简直要痛苦死了。特性太少,刚开始非常轻量,后面要啥啥没有
xiaocaiji111
241 天前
@uds9u32br 对,总是说影响复杂度,复杂度,会编码得都能看懂三目吧,我怀疑是增加 go 团队得复杂度,而不是用户得,所以不加。
CodingIran
241 天前
@ufan0 作为同时写 Flutter 和 iOS 原生的吐槽几点 Dart:

1.枚举不能忽略名称,静态变量(方法)不能忽略类名
```dart
currentConnectivityType: ConnectivityResult.wifi 👎

currentConnectivityType: .wifi 👍
```

```dart
return Container(color: Colors.white, ... 👎

return Container(color: .white, ... 👍
```

2.函数方法默认值鸡肋
有默认值的参数必须使用 `{}` 包起来,而且必须放在方法的最后,甚至默认值只能是常量 😵‍💫

```dart
void foo(int arg1, { int arg2 = 0, int arg3 = 0 }) 👎

void foo(int arg1 = 0, int arg2, int arg3 = 0) 👍
```

3.必须显性的书写 const
`EdgeInsets.only(top: 8)` 显然是一个常量,为何需要显性的写上 `const`,而不是编译器或 IDE 自动处理

```dart
padding: const EdgeInsets.only(top: 8) 👎

padding: .only(top: 8 ) 👍
```

4.残缺的 Optional ?

```dart
class Foo {
final int? count;

void test() {
if (count != null) {
count += 1; ❌
count! += 1; ❌
}
}
}

上面的代码无法编译通过,因为 count 定义为 `int?`,即使已经判断了非空,获取它之前仍然需要 `unwrap`,只能写:

count = count! + 1; 😅

```

5.异常处理理念落后

下面是个经典的 Dart 异常处理流程,存在 2 个问题:
- 可能抛出异常的方法没有明显的标志,只能依靠文档和阅读源码来确定这个方法是否会抛出异常,因此调用时很难确定一个方法是否需要` try catch`
- try 的 {} 内通常包含多个方法的组合调用,除非查看各个方法的实现,否则很难判断出哪些方法是会抛出异常的


```dart

// 定义一个可能抛出异常的方法
void functionCanThrowException() {
....

throw Exception('xxxxxxx');
}

// 调用
try {
functionA();
functionB();
functionCanThrowException();
functionC();
} catch(e) {
// handle error
}

```

6.反人类的 json 序列化
竟然需要借助 json_serializable 之类的插件才能完成其他语言自动实现的功能,生成一大堆 .g.dart 文件更是丑陋
aladdinding
241 天前
只有一种写法不好吗
jeesk
241 天前
@aladdinding

这种肯定是最好的, 否则
fori
forindex
forin
iterater
while

看着头大, 语法糖越多越恶心

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1106223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX