试了下 go in rust style

2022-07-04 13:23:14 +08:00
 fumeboy

现在 go 其实也可以写成 rust 的这样,但是没有 match 意义不大

package main

type Optional[T any] struct {
	Some   T
	IsNull bool
}

func Some[T any](value T) Optional[T] {
	return Optional[T]{
		value,
		false,
	}
}

type Result[T any] struct {
	OK    T
	Error error
}

func OK[T any](value T) Result[T] {
	return Result[T]{value, nil}
}

func a() Result[string] {
	return OK("1")
}

func main() {
	var s = Some(1)
	if s.IsNull {

	}
	var b = OK(a())
	if b.Error != nil {

	}
}

我在想能不能借助 IDE 包装一层 go++ 以提供自定义语法糖,go++ 翻释成 .go 后再去编译

2978 次点击
所在节点    Go 编程语言
16 条回复
blless
2022-07-04 13:29:38 +08:00
https://github.com/andeya/gust 在 github 上看到有个库。。
yazinnnn
2022-07-04 14:15:15 +08:00
这难道不叫 haskell style?
Leviathann
2022-07-04 14:26:05 +08:00
@yazinnnn 应该是 ADT
GuuJiang
2022-07-04 14:46:22 +08:00
其实完全没有可比性,因为不管 haskell 的 Maybe 和 Either 也好,rust 的 Option 和 Result 也好,都是一种和类型(sum type),而 go 里不管是原生的(result, err)也好,还是你这个例子里的 Optional 和 Result 也好,都是一种积类型(product type),二者是完全不同的两个东西,说句可能会引战的话,go 的 error handling 就是个没有理解和类型与积类型的区别,抄作业只抄了一半的结果
luob
2022-07-04 14:57:56 +08:00
没有模式匹配是万恶之源
hxtheone
2022-07-04 15:04:31 +08:00
没有 pattern match 莫得灵魂呀
rrfeng
2022-07-04 15:06:34 +08:00
应该是这样吧?

type Result interface { T|error }
novolunt
2022-07-04 15:13:14 +08:00
rust 不是号称用来惩罚程序员的吗
yazinnnn
2022-07-04 15:22:21 +08:00
别抄 result 了, 抄 either 吧,不然 err 连类型都没办法确定

https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Either.html

either 偏向右值是正确值, 毕竟 right is right
chenzhekl
2022-07-04 16:20:53 +08:00
这样写很浪费内存,本来 Go 就很吃内存了。
pastor
2022-07-04 16:26:00 +08:00
用 go 却不用 go style ,你们真是够够的了
DonkeyBenjamin
2022-07-04 16:30:36 +08:00
别人 rust 能这么玩,有 exhaustive pattern matching, if let, combinator, thiserror, anyhow, ... 你 go 有啥对应的
jorneyr
2022-07-04 16:49:34 +08:00
泛型、切片、数组?
傻傻分不清。
Leviathann
2022-07-04 16:51:07 +08:00
@GuuJiang 根据 rob pike 的博客来看,基本上可以确定就是一次重新发明了个三角形轮子的行为
binhb
2022-07-04 16:54:16 +08:00
@novolunt 可不是,被编译器疯狂羞辱
Mexion
2022-07-04 16:54:49 +08:00
那为什么不直接用 rust 还要用 go 呢

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

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

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

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

© 2021 V2EX