直接上github: https://github.com/vlang/v 前戏# 大概是在6月份的时候,在github上看到了这个玩意,我以为是??? 我下意识的去查了一下有没有人在讨论这个语言,但是关于这货的在国内讨论比较少 噱头如下: Simplicity: the language can be learned in less than an hour (有编程基础的人学起来很简单) Fast compilation: ~100k loc/s right now, ~1.2 million loc/s once x64 generation is mature enough (编译速度超级快) Easy to develop: V compiles itself in less than a second (编译快) Performance: within 3% of C (不太理解这个) Safety: no null, no globals, no undefined behavior, immutability by default (没有全局变量, 没有undefined) C to V translation ( c 可以编译到 v :不知道说对没有) Hot code reloading (热编译) Powerful UI and graphics libraries (自带ui库!!!) Easy cross compilation (交叉编译) REPL (命令行..有点鸡肋) Built-in ORM (不太懂) 编译安装# 看到是c的东东,我心动了(实际上,最起始几个版本是Go实现的) 废话少说,编译安装(windows的同学请在WSL下试玩) Copy git clone https://github.com/vlang/v cd v make ln -s $PWD/v /usr/local/bin/v v --version # 1.xxx 新手朋友记得不要删除这个v目录,不然会报错(这货是自己编译自己,确实有点6) 现在你就可以进入REPL了 Copy ☁ /tmp vlan V 0.1.18 Use Ctrl-C or `exit` to exit >>> println('hello world') hello world >>> 一个小问题# 不知道有小伙伴注意到了,我是进入了/tmp下才开启的,原因是是这货还没完善,当你启动后会在当前目录下留下缓存文件(编译好的.a.out.c或者其他文件),这对于强迫症怎么忍! 给大家分享一个脚本 Copy #/usr/bin/env bash cd /tmp vlan 还有你在运行文件的时候同样会生成这些文件,只能说相当难受了,我已经提过issues,看开发者多久弄好吧 https://github.com/vlang/v/issues/1725 文档# 目前官方的文档写的有些乱,原因是还在开发中,有很多特性还写进去 (在v中变量不能使用大写,所以不能使用js中的命名方法) v在运行会产生大量的缓存文件,这是c直接编译的结果,希望快点完善这个啊 基础类型# bool string byte int .. 注释# // this is a single line comment /* fetch */ 变量# 在vlang中变量是一个必须使用的, 而且在未加修饰符的前提下将不可改变 Copy name := ‘d1y’ // string age := 20 // int println(name) println(age) 需要改变的变量必须添加修饰符 mut Copy mut name := ‘d1y’ name = ‘fuck’ println(name) 字符串# 字符串是使用最多的一种数据类型,但是在v中字符串类型的方法并不多 Copy mut name := ’1234’ println(name.len) // 4 println(name.substr(0,1)) // 1 数组# 在v中,数组的方法也太少了 Copy mut nums := [1,2,3] nums << 1 // 添加 nums << [4,5,6] // 合并操作,这两个操作都会修改原先的数组 println(nums.len) Maps# Maps 在某些场景下是很有用的东西(目前我还不知) Copy mut m := map[string]int m[‘1’] = 1 if# v中实现的if语法层面和py有点像 Copy a := 1 b := 2 if a true || 1 for循环# Copy nums := [1,2,3] for i, num in nums { println(i) println(num) } 可以加上循环条件 Copy mut sum := 0 mut i := 0 for i <= 100 { sum += i i++ } println(sum) // ==> “5050" 也可是在内部通过 break 来停止循环 Copy mut num := 0 for { num++ if num >= 10 { break } } println(num) // ==> "10" 通过continue来阻断本次循环 Copy for i := 0; i < 10; i++ { // Don't print 6 if i == 6 { continue } println(i) } 需要说明的, 这里的i在循环外是无法获取的 Match ( swtich )# 在v中是没有switch,但是有一个match来控制流程 Copy os := 'windows' print('V is running on ') match os { 'darwin' => println('macOS.') 'linux' => println('Linux.') else => println(os) } 结构体# 在v中实现有点啰嗦,暂时不知道它的应用场景是什么 Copy struct Point { x int y int } p := Point{ x: 10 y: 20 } println(p.x) 修饰符: & 意义不明,暂时不知道它的应用场景 方法# Copy struct User { age int } fn (u User) can_register() bool { return u.age > 16 } user := User{age: 10} println(user.can_register()) // ==> "false" user2 := User{age: 20} println(user2.can_register()) // ==> "true" 高阶函数# 用起来感觉很啰嗦. Copy fn sqr(n int) int { return n * n } fn run(value int, op fn(int) int) int { return op(value) } fn main() { println(run(5, sqr)) // "25" } 常量# 我在这里很疑惑, 因为在定义个变量中,如果没设置修饰符就不能修改,那在这里顶一个const常量的意义何在? Copy cosnt ( PI = 3.14 Word = ‘世界' ) println(PI) println(world) ** 常量永远不能改变 ** 模块# v到这里只有,我感觉文档写的就很烂了(当然,全文档都很烂,现在只是个玩具语言) 要创建一个模块,你需要创建一个同名的文件夹和文件名,例子 mymodule/mymodule.v Copy // 首先定义一个命名空间 module mymodule pub fn say_hi() { println(‘hello’) reutrn 1 } 在另一一个文件文件中就可以直接import了 Copy module main import mymodule fn main() { Mymodule.say_hi() } interfaces# 暂时未知 enums# 暂时未知 defer# 延迟, 咱未知应用场景 Copy fn read_log() { f := os.open('log.txt') defer { f.close() } ... if !ok { // defer statement will be called here, the file will be closed return } ... // defer statement will be called here, the file will be closed } 编译相关# 如果在if 的前面加上 $, 那么它只能用来检测os type 和 debug Copy $if windows { println('Windows') } $if linux { println('Linux') } $if mac { println('macOS') } $if debug { println('debugging') } 热重启模式# 在v中实现了这种热编译模式,不过这货产生的缓存文件机制真的烦人 Copy module main import time import os // 在需要热更新的地方添加 [live] 字眼 [live] fn print_message() { println(‘hot reload’) } fn main() { for { print_message() time.sleep_ms(500) } } 在需要的地方添加[live], 然后编译的时候vlan -live run.v (暂时未知) 交叉编译# v的噱头就是快和多平台编译 Copy vlan -os windows run.v vlan -os linux run.v vlan -os mac run.v 交叉编译脚本# 我只能说牛逼🐂,这货可以把os模块代理到全局, 来写简单脚本 Copy // 使用 #v 把 os 代理到全局来 #v rm('build/*') // Same as: for file in ls('build/') { rm(file) } mv('*.v', 'build/') // Same as: for file in ls('.') { if file.ends_with('.v') { mv(file, 'build/') } } 后记# 总的来说,我很看好这么语言,不过才刚刚起步 作者是个个人开发者,如果没有牛逼点的公司接盘的话,8成要凉 目前项目贡献只有三位老哥 希望越来越好吧,用来写写脚本绰绰有余,编译速度真的超级快 要是巨硬接盘就好了 作者: d1y 出处:https://www.cnblogs.com/kozo4/p/11408418.html 版权:本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。https://www.cnblogs.com/kozo4/p/11408418.html