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)
}