直接上github: https://github.com/vlang/v

前戏

大概是在6月份的时候,在github上看到了这个玩意,我以为是???

V字仇杀队 ??

我下意识的去查了一下有没有人在讨论这个语言,但是关于这货的在国内讨论比较少

噱头如下:

  • 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下试玩)

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


☁ /tmp vlan
V 0.1.18
Use Ctrl-C or `exit` to exit
>>> println('hello world')
hello world
>>>

一个小问题

不知道有小伙伴注意到了,我是进入了/tmp下才开启的,原因是是这货还没完善,当你启动后会在当前目录下留下缓存文件(编译好的.a.out.c或者其他文件),这对于强迫症怎么忍!

给大家分享一个脚本


#/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中变量是一个必须使用的, 而且在未加修饰符的前提下将不可改变


name := ‘d1y’ // string
age := 20 // int println(name)
println(age)

需要改变的变量必须添加修饰符 mut


mut name := ‘d1y’ name = ‘fuck’
println(name)

字符串

字符串是使用最多的一种数据类型,但是在v中字符串类型的方法并不多


mut name := ’1234’ println(name.len) // 4
println(name.substr(0,1)) // 1

数组

v中,数组的方法也太少了


mut nums := [1,2,3] nums << 1 // 添加 nums << [4,5,6] // 合并操作,这两个操作都会修改原先的数组 println(nums.len)

Maps

Maps 在某些场景下是很有用的东西(目前我还不知)


mut m := map[string]int m[‘1’] = 1

if

v中实现的if语法层面和py有点像

a := 1
b := 2 if a<b {
println(‘cowsay’)
} else {
println(‘runtime’)
} // else if

v中实现了所谓了三元运算符


num := 13 s := if num % 2 == 0 {
‘env'
} else {
‘odd'
}
Println(s)

in

in 是可以判断某个值是否存在


nums := [1,2,3]
pirntln(1 in nums) // => true || 1

for循环


nums := [1,2,3] for i, num in nums {
println(i)
println(num)
}

可以加上循环条件


mut sum := 0
mut i := 0
for i <= 100 {
sum += i
i++
}
println(sum) // ==> “5050"

也可是在内部通过 break 来停止循环


mut num := 0
for {
num++
if num >= 10 {
break
}
}
println(num) // ==> "10"

通过continue来阻断本次循环


for i := 0; i < 10; i++ {
// Don't print 6
if i == 6 {
continue
}
println(i)
}

需要说明的, 这里的i在循环外是无法获取的

Match ( swtich )

v中是没有switch,但是有一个match来控制流程


os := 'windows'
print('V is running on ')
match os {
'darwin' => println('macOS.')
'linux' => println('Linux.')
else => println(os)
}

结构体

v中实现有点啰嗦,暂时不知道它的应用场景是什么


struct Point {
x int
y int
} p := Point{
x: 10
y: 20
}
println(p.x)

修饰符: & 意义不明,暂时不知道它的应用场景

方法


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"

高阶函数

用起来感觉很啰嗦.


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常量的意义何在?


cosnt (
PI = 3.14
Word = ‘世界'
) println(PI)
println(world)

** 常量永远不能改变 **

模块

v到这里只有,我感觉文档写的就很烂了(当然,全文档都很烂,现在只是个玩具语言)

要创建一个模块,你需要创建一个同名的文件夹和文件名,例子

mymodule/mymodule.v


// 首先定义一个命名空间
module mymodule pub fn say_hi() {
println(‘hello’)
reutrn 1
}

在另一一个文件文件中就可以直接import


module main import mymodule fn main() {
Mymodule.say_hi()
}

interfaces

暂时未知

enums

暂时未知

defer

延迟, 咱未知应用场景


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 typedebug


$if windows {
println('Windows')
}
$if linux {
println('Linux')
}
$if mac {
println('macOS')
} $if debug {
println('debugging')
}

热重启模式

v中实现了这种热编译模式,不过这货产生的缓存文件机制真的烦人


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的噱头就是快和多平台编译


vlan -os windows run.v
vlan -os linux run.v
vlan -os mac run.v

交叉编译脚本

我只能说牛逼

v语言怎么玩的更多相关文章

  1. 半小时学会V语言

    半小时学会V语言 1. V语言简介 V是一个静态类型.编译型的编程语言,目标是构建可维护软件.与Go语言相似,并受Oberon,Rust和Swift语言影响.V语言非常简单,只需要半小时就能学会这门语 ...

  2. V语言横空出世,C/C++/Java/Python/Go地位不保

    V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...

  3. V语言 基本使用

    新手必看-如何安装配置vlang运行环境(linux,macOS篇) 前置条件 发稿截止前只有Linux 或者 macOS系统能编译通过. 你需要安装clang或gcc 如果是macOS上需运行xco ...

  4. Scala HandBook

    目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6 ...

  5. Node.js 给前端带来了什么

    在软件开发领域,前端工程师曾经是一个比较纠结的职业.在Web技术真正发展起来之前的相当长一段时间里,由于技术门槛很低,前端工程师行业一直是鱼龙混杂的状态.其中很多号称是Web开发者的人实际上并没有什么 ...

  6. 基于HTML5的WebGL电信网管3D机房监控应用

    先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: http://www.hightopo.com/guide/guide/core/3d/examples/exam ...

  7. linux编程开发命令

    test命令命令功能test命令是shell环境中测试条件表达式的实用工具.命令语法test(选项)选项说明-b〈文件〉如果文件为一个块特殊文件,则为真;-c<文件〉,如果文件为一个字符特殊文件 ...

  8. 基于HTML5的电信网管3D机房监控应用

    先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: 随着PC端支持HTML5浏览器的普及,加上主流移动终端Android和iOS都已支持HTML5技术,新一代的电信网 ...

  9. C++小思

    Bjarne那稀疏的棕褐色头发, 有点红的眼睛, 这个可爱的好老头, 感觉他更应该是一个哲学家, 因为他用编程的语言C++ 揭示了我们这个纷繁复杂世界的本质: 对象. 对的, 世界是由对象组成的, 并 ...

随机推荐

  1. 搭建oj平台

    欢迎使用https://github.com/QingdaoU/OnlineJudgeDeploy

  2. 个人永久性免费-Excel催化剂功能第60波-数据有效性验证增强版,补足Excel天生不足

    Excel在数据处理.数据分析上已经是公认的最好用的软件之一,其易用性和强大性也吸引无数的初中高级用户每天都在使用Excel.但这些优点的同时,也带出了一些问题,正因为其不同于一般的专业软件,需要专业 ...

  3. 前端响应式のmedia文件分离

    响应式cssのmedia文件分离 media简介 1.媒体查询,添加自CSS3 2.一个媒体查询由一个可选的媒体类型和零个或多个使用媒体功能的限制了样式表范围的表达式组成,允许内容的呈现针对一个特定范 ...

  4. Kafka学习(三)-------- Kafka核心之Cosumer

    了解了什么是kafka( https://www.cnblogs.com/tree1123/p/11226880.html)以后 学习核心api之消费者,kafka的消费者经过几次版本变化,特别容易混 ...

  5. 详述Spring对数据校验支持的核心API:SmartValidator

    每篇一句 要致富,先修路.要使用,先...基础是需要垒砌的,做技术切勿空中楼阁 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349 ...

  6. 如何实现Excel多人共享与协作

    1.写在前面的话 本人从事信息化工作多年,对Excel等电子表格的多人共享与协作接触较早,帮助客户实施的方案也较多,因此有些体会和认识.正好看到网上这方面的讨论较多,但都不完整,我就进一步做了专题调研 ...

  7. IOS应用无法下载、此时无法安装应用程序

    无法安装应用 app开发者,进行程序测试,重试还不行,就重新打包, 个人,更改wifi的dns 在“设置” –> “WiFi” –> 进入当前的WiFi 进入之后点击旁边的叹号,然后进入之 ...

  8. springBoot数据校验与统一异常处理

    概念 异常,在程序中经常发生,如果发生异常怎样给用户一个良好的反馈体验就是我们需要处理的问题.以前处理异常信息,经常都是给前端一个统一的响应,如数据错误,程序崩溃等等.没办法指出哪里出错了,这是一种对 ...

  9. Could not link: /usr/local/etc/bash_completion.d/brew

    用终端 brew update 或 brew install ** 时遇到的问题,详细如下: Error: Could not link: /usr/local/etc/bash_completion ...

  10. 【iOS】UILabel 常用属性设置

    UILabel 的一些常用属性,示例代码如下: // 字体大小 label.font = [UIFont systemFontOfSize:14.0]; label.font = [UIFont fo ...