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成要涼
目前項目貢獻只有三位老哥

希望越來越好吧,用來寫寫腳本綽綽有餘,編譯速度真的超級快

要是巨硬接盤就好了