【GitHub探索】v语言上手,用vlang写一个聊天应用

前言

vlang(v语言)自从6月份突然炒热起来,不知不觉到了11月,正式版就要出来了,在11月的GitHub Trending榜中依然排在前10。这着实令人好奇,因此笔者决定试用一下vlang,写一个小应用,体验一下感受。

v语言上手

v语言可以在GitHub传送门中clone下载,支持多操作系统,有以下的特性:

  • 快速编译
  • 快速转译
  • 热更

其余的,还有自带的GUI库、结合Go与Rust的语言特性之类,也可以算作所谓的卖点。

安装v语言也很简单,比如在windows上,首先需要安装Visual Studio提供的MSVC环境,然后只需要:

git clone https://github.com/vlang/v.git

然后执行:

./make.bat

再设置环境变量到PATH,就能够随时随地执行vlang了。

如果要更新vlang,则只需要:

v up

就可以自动更新并编译了。

写一个聊天应用

为了试用vlang,笔者简单写了个聊天应用shingekinov,设计上暂时用了全局锁而非消息队列,然后也顺带把vlang的自带网络库熟悉了一下。

vlang并没有全局变量的说法,因此需要通过在main函数里保管指针启动实例。对于一个简单的聊天服务器实例可以如下设计:

struct Server {
    instance net.Socket
mut:
    clients map[string]net.Socket
    pairs map[string]string
    mtx sync.Mutex
}

clients存储客户端socket,而pairs存储聊天的一对。每一个客户端连接都采用go关键字(orz)创建一个单独的线程进行handle。要注册客户或者处理消息时,则上全局锁。全局锁lock方法会自动等待,所以暂时不会造成死锁。handle方法如下:

fn handle(s net.Socket, server mut Server) {
    fdint := s.sockfd
    fd := fdint.str()
    logger.info('$fd connected!!!')
    s.write('$fd: Welcome to ShinGeKiNoV Chat Platform~')
    server.mtx.lock()
    server.register(fd, s)
    server.mtx.unlock()
    for {
        msg := s.read_line().replace('\r\n', '').replace('\n', '')
        if msg.len > 0 {
            logger.info('Received message size ${msg.len} from $fd: $msg')
        }
        server.mtx.lock()
        if server.is_chatting(fd) {
            match msg {
                '' {
                    logger.warn('$fd itself disconnected...')
                    server.leave_chat(fd)
                    server.unregister(fd)
                    break
                }
                'exit' {
                    logger.warn('$fd is going to leave chat...')
                    server.leave_chat(fd)
                }
                else {
                    server.handle_chat(fd, msg)
                }
            }
        } else {
            match msg {
                '' {
                    logger.warn('$fd itself disconnected...')
                    server.leave_chat(fd)
                    server.unregister(fd)
                    break
                }
                'exit' {
                    logger.warn('$fd is requesting to disconnect...')
                    s.write('Disconnecting...')
                    server.leave_chat(fd)
                    server.unregister(fd)
                    break
                }
                'help' {
                    s.write(server.help())
                }
                'list' {
                    s.write(server.list())
                }
                'chat' {
                    server.join_chat(fd)
                }
                else {
                    s.write('Invalid command: $msg! Type "help" for options~')
                }
            }
        }
        server.mtx.unlock()
    }
}

值得一提的是,在做这个简单聊天服务器的同时,笔者也发现vlang当前的版本虽然看似功能非常多,但是每一个功能都还是非常稚嫩,可以说是挖了一个很大的坑。比如当前版本的map采用普通二叉树存储key(orz),并且在insert与delete上都是有bug的;再比如socket客户端断开时,没有EOF的支持…v语言,也成为了笔者码代码以来第一个需要改标准库源码才能运行成功的编程语言(orz)。

总结

v语言,首先是库的支持,还是太笼统了,离真正可用还差一段距离,并且没有完善GC的支持,在线上环境这一part是很致命的。

按v语言的特性来看,算是一种“翻译语言”,可以翻译为C语言,似乎也能翻译成javascript,因此挺适合做热更的需求,对于游戏开发似乎很有用喔。

总的来讲,这些细节还是得慢慢磨,期待后续吧~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个 GitHub 包的基本步骤如下: 1. 首先,你需要一个 GitHub 帐户。如果没有,请先注册一个。 2. 在 GitHub 上创建一个新的仓库,作为你的项目根目录。 3. 在本地计算机上创建一个GitHub 仓库相对应的文件夹,并进入该文件夹。 4. 在该文件夹下使用命令行工具初始化 npm 项目,运行 `npm init` 命令,并按照提示进行配置。 5. 在根目录下创建一个名为 `index.js` 的文件,这将是你的包的主要入口点。 6. 编你的代码,将其放在 `index.js` 文件中,并导出你想要公开的方法和对象。 7. 在 `package.json` 文件中添加项目的元数据,如名称、版本、描述、作者、依赖项等。 8. 如果需要,编测试代码,并将其放在 `test` 文件夹下。 9. 在根目录下创建一个名为 `.gitignore` 的文件,并将不需要上传到 GitHub 的文件或文件夹添加到其中。 10. 使用命令行工具将代码推送到 GitHub 仓库中,运行 `git add .`、`git commit -m "Initial commit"`、`git remote add origin [GitHub 仓库地址]` 和 `git push -u origin master` 命令。 11. 在 GitHub 仓库的页面中,点击 "Release" 按钮,创建一个新的发布版本,并上传你的代码。 注意事项: - 在编代码之前,最好先确定你的包的目标用户和用途,并确保你的代码符合这些需求。 - 编文档并添加到 README.md 文件中,以帮助其他用户了解如何使用你的包。 - 如果你想让其他开发者参与到你的项目中,可以考虑使用 GitHub 的 Issues 和 Pull Requests 功能,以便于协作和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值