v语言怎么玩
Posted kozo4
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了v语言怎么玩相关的知识,希望对你有一定的参考价值。
直接上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下试玩)
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 := Userage: 10
println(user.can_register()) // ==> "false"
user2 := Userage: 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 type
和 debug
$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
交叉编译脚本
我只能说牛逼??,这货可以把os
模块代理到全局, 来写简单脚本
// 使用 #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成要凉
目前项目贡献只有三位老哥
希望越来越好吧,用来写写脚本绰绰有余,编译速度真的超级快
要是巨硬接盘就好了
以上是关于v语言怎么玩的主要内容,如果未能解决你的问题,请参考以下文章
C语言函数调用的传参方法总结,Caller分配内存,Called填充内存
在Quartus中如何原理图(.bdf文件)可以直接转化为Verilog语言文件(.v文件)