V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
fumeboy
V2EX  ›  Go 编程语言

试了下 go in rust style

  •  
  •   fumeboy · 2022-07-04 13:23:14 +08:00 · 2954 次点击
    这是一个创建于 873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在 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 后再去编译

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

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

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

    either 偏向右值是正确值, 毕竟 right is right
    chenzhekl
        10
    chenzhekl  
       2022-07-04 16:20:53 +08:00
    这样写很浪费内存,本来 Go 就很吃内存了。
    pastor
        11
    pastor  
       2022-07-04 16:26:00 +08:00
    用 go 却不用 go style ,你们真是够够的了
    DonkeyBenjamin
        12
    DonkeyBenjamin  
       2022-07-04 16:30:36 +08:00
    别人 rust 能这么玩,有 exhaustive pattern matching, if let, combinator, thiserror, anyhow, ... 你 go 有啥对应的
    jorneyr
        13
    jorneyr  
       2022-07-04 16:49:34 +08:00   ❤️ 1
    泛型、切片、数组?
    傻傻分不清。
    Leviathann
        14
    Leviathann  
       2022-07-04 16:51:07 +08:00
    @GuuJiang 根据 rob pike 的博客来看,基本上可以确定就是一次重新发明了个三角形轮子的行为
    binhb
        15
    binhb  
       2022-07-04 16:54:16 +08:00 via iPhone
    @novolunt 可不是,被编译器疯狂羞辱
    Mexion
        16
    Mexion  
       2022-07-04 16:54:49 +08:00
    那为什么不直接用 rust 还要用 go 呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   906 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:05 · PVG 06:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.