v语言怎么玩

  • 2019 年 10 月 3 日
  • 筆記

直接上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  

交叉编译脚本

我只能说牛逼?,这货可以把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成要凉
目前项目贡献只有三位老哥

希望越来越好吧,用来写写脚本绰绰有余,编译速度真的超级快

要是巨硬接盘就好了

Exit mobile version