root@SW-SERVER:~/v_test# cat hi.v
//結構體
struct point{
x int
y int
}
/*
struct Foo{
a int //私有 不可變
mut: //私有 可變
b int
c int
pub: //公開 不可變
d int
pub mut: //公開 僅在父模塊
e int
pub mut mut: //公開 父模塊內外都可以用
f int
}
*/
//結構體-方法
struct User{
age int
mut:
is_registered int
}
//(u User) u 相當於self or this
/*
V 沒有 class概念,但是我們可以在結構體上定義方法。
方法是具有特殊行參的函數。特殊行參 放在 fn關鍵字 和方法名之間的參數列表中。
簡單示例(can_register 方法具有 User 類型的 特殊行參 u):
不和其他語言一樣,使用 self 或 this ,而是使用短名稱,當然最好一個字母長
*/
fn (u User) can_register() bool{
return u.age > 16
}
/*
純函數
V語言的函數默認是純函數,也就是函數的輸出結果只依賴輸入的參數,並且沒有其它的影響。
因爲V語言沒有全局變量,且所有的參數默認都是隻讀的,即使傳入的引用也是默認只讀的。
然後V語言並不純的函數式語言。我們可以通過mut來修飾行參數,使得可以被修改:
*/
fn (u mut User) register(){
u.is_registered = 10
}
struct Color{
r int
g int
b int
}
fn (c Color) str() string{return '{$c.r,$c.g,$c.b}'}
fn rgb(r,g,b int) Color {return Color{r:r,g:g,b:b}}
//常量
const(
Numbers = [1,2,3]
Red = Color{r:255,g:0,b:0}
Blue = rgb(0,0,255)
)
fn main()
{
p := point{
x: 10
y: 20
}
println(p.x)
println(p.y)
p1 := &point{30,40}
println(p1.x)
println(p1.y)
mut user := User{age:10}
mut user1 := User{age:20}
println(user.is_registered)
println(user1.can_register())
user.register()
println(user.is_registered)
println(Numbers)
println(Red)
println(Blue)
}
root@SW-SERVER:~/v_test# cat interface.v
//interface 接口
struct Dog{}
struct Cat{}
fn (d Dog) speak() string{
return 'woof'
}
fn (c Cat) speak() string{
return 'meow'
}
interface Speaker{
speak() string
}
fn perform(s Speaker){
println(s.speak())
}
//枚舉
enum Color{
red green blue
}
//可選類型 和 錯誤處理
struct User{
id int
name string
}
struct Repo{
users []User
}
fn new_repo() Repo{
return Repo{
users: [User{1,'Andrew'},User{2,'Bob'},User{10,'Charles'}]
}
}
fn (r Repo) find_user_by_id(id int){
for user in r.users{
if user.id == id{
return user
}
}
return error('User $id not found')
}
fn main(){
dog := Dog{}
cat := Cat{}
perform(dog)
perform(cat)
mut color := Color.red
println(color)
color = .green
println(color)
repo := new_repo()
user := repo.find_user_by_id(10) or {
return
}
println(user.id)
println(user.name)
}