年轻人的第一篇V语言笔记
V語言極限學習
我聽說V語言看文檔半小時就能完全掌握????以我的智商一小時掌握不了我就給各位科普一下廣告法???
宇宙慣例hello world
// first v code fn main(){printIn("hello world") }- 不需要行結束符
- v函數使用fn聲明,和其他語言一樣,main函數是程序入口
- 注釋規則和c一樣
- 輸出使用內置函數 printIn()
宇宙慣例2. 1+1
fn main(){a := 1b := 2mut name := "v langue"name = "v"printIn(add(a,b)) } fn add(a int,b int) int {return a+b }- 變量名在類型名之前(反人類)
- 函數和變量都可以提前,也就是可以“先調用,再聲明”
- 變量用:=聲明并初始化,變量默認不允許修改,要修改必須加 mut
- 修改變量用 =
- v沒有全局變量,變量只能在函數中定義
- 定義的變量必須使用,不允許只定義,不使用,和go像
- 子代碼塊中不允許使用父代碼塊中已經定義的變量,如下面的代碼會編譯出錯
基本數據類型
string
在V中,字符串是只讀字節數組。 字符串數據使用UTF-8編碼。
單引號和雙引號都可用于表示字符串(TODO:尚不支持雙引號)。 為保持一致性,vfmt將雙引號轉換為單引號,除非該字符串包含單引號字符。
字符串是不可變的。 這意味著子字符串函數非常有效:不執行復制,不需要額外的分配。
All operators in V must have values of the same type on both sides. This code will not compile if age is an int:
println('age = ’ + age)
We have to either convert age to a string:
println('age = ’ + age.str())
or use string interpolation (preferred):
println(‘age = $age’)
翻譯
V中的所有運算符必須在兩邊都具有相同類型的值。如果age是int: println(‘age = ’ + age’),這段代碼將無法編譯。我們必須將age轉換為一個字符串:println('age = ’ + age.str())或使用字符串插值(preferred): println(‘age = ’ $age’)
數組
fn main(){a := [1,2,3]printIn(a) }- 數組類型由數組第一個元素決定
- 數組中元素類型必須相同
- 使用<<在數組末尾插入元素
- 使用.len返回數組長度
- val in array,如果數組array包含val,返回true
字典
mut m := map[string]int{} // Only maps with string keys are allowed for now m['one'] = 1 println(m['one']) // ==> "1"這個字典人家似乎還沒有寫好,emmmm,一堆TODO,你先寫著,咱不急,看下一個
流程控制
if
a := 10 b := 20 if a < b { println('$a < $b') } else if a > b { println('$a > $b') } else { println('$a == $b') }- 條件沒有小括號
- 始終有大括號
- if語句可以作為一個表達式
in
作用:
上下兩個是等價的,使用下面的語法時,v不會創建數組
for
for比較牛逼,因為我看他文檔寫的比之前的都多…(狗頭),知道為啥嗎,應為v只有一種循環,就是for,哈哈哈哈
雖然只有一種循環,但人家for有好幾種啊~~~
for in
fn main(){list := ['a','b','c']for value in list{printIn(value)} }value-in
如果需要數據的索引,可以用另一種方法
names := ['Sam', 'Peter'] for i, name in names {println('$i) $name') // Output: 0) Sam } // 1) Peter第二種for(類似于while)
mut sum := 0 mut i := 0 for i <= 100 {sum += ii++ } println(sum) // ==> "5050"- 不寫條件將導致死循環
第三種for(類似c)
for i := 0; i < 10; i++ {println(i) }- 為啥這兒的i不用加mut而可以變化??別問,文檔這么寫的!!!
Here i doesn’t need to be declared with mut since it’s always going to be mutable by definition.
switch
os := 'windows' print('V is running on ') switch os { case 'darwin':println('macOS.') case 'linux':println('Linux.') default:println(os) }這里的switch和c里的差不多,只不過v中不需要在每個case后面加break
結構體
結構體???你可別告訴我你面向過程啊
struct Point {x inty int } p := Point{x: 10 y: 20 } println(p.x) // Struct fields are accessed using a dot- 屬性訪問用.
- 結構是在堆棧上分配的。若要在堆上分配結構并獲取指向它的指針,請使用&,如
- 結構體嵌套,目前還不支持,不過快了
訪問修飾符
默認的結構體是私有的,不可變的,可以使用訪問修飾符pub 和 mut 修改,pub和mut有五種組合(不明白了吧,還有一種pub mut mut),先把文檔復制過來再看是個什么妖魔
struct Foo {a int // private immutable (default) mut: b int // private mutable c int // (you can list multiple fields with the same access modifier) pub: d int // public immmutable (readonly) pub mut: e int // public, but mutable only in parent module pub mut mut: f int // public and mutable both inside and outside parent module } // (not recommended to use, that's why it's so verbose)| 不寫(默認) | 私有,不可變 |
| mut | 私有,可變 |
| pub | 公有,不可變 |
| pub mut | 公有,僅在父模塊可變 |
| pub mut mut | 公有,父模塊內部外部都可變 |
一臉懵逼是吧,哈哈哈,依老衲看來,這和c++中的public,private啥的一樣,只不過他的變量(不能叫變量吧,先這樣叫)默認是常量(const)你定義時需要加一個mut才能變成其他語言的“變量”,加一個pub這個變量就變成公有變量,從結構體外部可以訪問了,加一個pub mut他就在結構體內外可以訪問,而只能在結構體內部能改變,如字符串結構體中的len,外部可以訪問他,但不能改變它,內部才能改變,最后pub mut mut 就是內外都可以訪問,都可以修改。
Methods,方法
v沒有class 嚇死我了,辛虧有方法
一個方法就是一個函數,它帶一個特殊的參數(接收器)
// 繼續粘貼文檔代碼,CV工程師,年薪百萬,啊啊啊啊啊啊啊啊 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"- 這里的can_register就是一個方法,他的接收器是u,類型是User,官方說接收器名字最好用簡短的,別用self,this啥的,一個字母最好(要不然沒特色,開玩笑的)
Pure functions by default
英語捉急,無法翻譯,大概就是默認的純函數,應為V沒有全局變量,加上變量默認不能改變,哪怕是傳參時也一樣,
后面開始賦值粘貼了
struct User { mut:is_registered bool } fn (u mut User) register() {u.is_registered = true } mut user := User{} println(user.is_registered) // ==> "false" user.register() println(user.is_registered) // ==> "true" fn multiply_by_2(arr mut []int) {for i := 0; i < arr.len; i++ {arr[i] *= 2} }mut nums := [1, 2, 3] multiply_by_2(mut nums) println(nums) // ==> "[2, 4, 6]"- 注意,在調用此函數時,必須在nums之前添加mut。 這清楚地表明被調用的函數將修改該值。
- 最好返回值而不是修改參數。修改參數應該只在應用程序的性能關鍵部分執行,以減少分配和復制。
- 使用user.register()或user = register(user)代替register(mut user)。
- V可以很容易地返回對象的修改版本:
常量const
const (PI = 3.14World = '世界' ) println(PI) println(World)- 常量使用const聲明。
- 它們只能在模塊級別(函數之外)定義。
- 常量名稱必須大寫。這有助于將它們與變量區分開來。
- 常數永遠不會改變。
- V常量比大多數語言更靈活。您可以分配更復雜的值
- 不允許使用全局變量,因此這非常有用。
模塊化
V是一種非常模塊化的語言。鼓勵創建可重用模塊,而且非常簡單。要創建一個新模塊,請創建一個目錄,其中包含模塊的名稱和.v文件
cd ~/code/modules mkdir mymodule vim mymodule/mymodule.v// mymodule.v module mymodule// To export a function we have to use `pub` pub fn say_hi() {println('hello from mymodule!') }你可以在mymodule /中擁有盡可能多的.v文件。
使用v -lib~ / code / modules / mymodule構建它。
就是這樣,您現在可以在代碼中使用它
- 注意,每次調用外部函數時都必須指定模塊。
- 模塊名稱應該簡短,不超過10個字符。
- 不允許循環導入。
- 您可以在任何地方創建模塊。
- 所有模塊都被靜態地編譯成一個可執行文件。
看了兩個小時了,還沒看完,以我的智商,算是告別代碼界了,再見各位,我自閉了
總結
以上是生活随笔為你收集整理的年轻人的第一篇V语言笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机服务中无spool,打印服务SPO
- 下一篇: struct cdev结构体和cdev_