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 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成要涼
目前項目貢獻只有三位老哥
希望越來越好吧,用來寫寫腳本綽綽有餘,編譯速度真的超級快
要是巨硬接盤就好了