結(jié)構(gòu)體定義
v結(jié)構(gòu)體的名字必須是大寫(xiě)字母開(kāi)頭,如果是小寫(xiě)字母開(kāi)頭會(huì)編譯報(bào)錯(cuò)
struct Point {
x int
y int
}
p := Point{
x: 10
y: 20
}
println(p.x) // 結(jié)構(gòu)體字段通過(guò)點(diǎn)號(hào)來(lái)訪問(wèn)
結(jié)構(gòu)體被分配到內(nèi)存的棧中,引用類(lèi)型
取結(jié)構(gòu)體地址:&
p := &Point{10, 10}
println(p.x)
空結(jié)構(gòu)體:
struct Empty {}
fn main() {
println(sizeof(Empty)) //空結(jié)構(gòu)體占用內(nèi)存的大小為0
}
結(jié)構(gòu)體占用內(nèi)存:
sizeof( )可以返回結(jié)構(gòu)體占用內(nèi)存字節(jié)大小
字段
結(jié)構(gòu)體字段默認(rèn)也是不可變,使用var為可變
結(jié)構(gòu)體字段的可變性和訪問(wèn)控制,參考訪問(wèn)控制章節(jié)
如果結(jié)構(gòu)體字段名需要是關(guān)鍵字,可以通過(guò)使用@作為前綴也可以編譯通過(guò)
這一點(diǎn)在跟C庫(kù)集成時(shí),比較常用,一些C庫(kù)的struct的字段有些剛好是V的關(guān)鍵字,可以使用@前綴,編譯成C代碼時(shí)@前綴會(huì)被去掉,剛好就是C的struct中的字段名
struct Foo {
@type string
}
fn main() {
foo := Foo{ @type: 'test' }
println(foo.@type)
}
結(jié)構(gòu)體字段支持默認(rèn)值
struct Foo {
a int
b int = 7 //默認(rèn)值7
}
fn main() {
foo := Foo{a:1}
println(foo.a) //輸出1
println(foo.b) //輸出默認(rèn)值7
foo2:= Foo{a:1,b:2}
println(foo2.b) //輸出2
}
結(jié)構(gòu)體變量基于另一個(gè)變量創(chuàng)建,同時(shí)合并新的字段值
struct Foo {
a int
b int = 7 //默認(rèn)值7
}
fn main() {
foo := Foo{a:1}
foo2 := { foo | a: 42 } //foo2是在foo的基礎(chǔ)上,通過(guò)|合并新的字段值
println(foo2.a) //輸出合并后的新值42
println(foo2.b) //輸出未改變的值7
}
短字面量創(chuàng)建結(jié)構(gòu)體變量
當(dāng)函數(shù)的參數(shù)是結(jié)構(gòu)體變量時(shí),這個(gè)語(yǔ)法可以簡(jiǎn)化結(jié)構(gòu)體變量的創(chuàng)建,這個(gè)語(yǔ)法在ui模塊比較常用到,用來(lái)簡(jiǎn)化函數(shù)參數(shù)
module main
struct User {
name string
age int
}
fn add(u User) {
println(u)
}
fn main(){
add(User{name:'jack',age:22}) //標(biāo)準(zhǔn)方式
add({name:'tom',age:23}) //簡(jiǎn)短方式,省略類(lèi)型
add(name:'tt',age:33) //更簡(jiǎn)短的方式,省略類(lèi)型和大括號(hào)
}
訪問(wèn)控制
結(jié)構(gòu)體默認(rèn)是模塊級(jí)別的,使用pub關(guān)鍵字定義公共級(jí)別
pub struct Point { //公共級(jí)別,可以被別的模塊使用
x int
y int
}
組合
struct 可以組合, 用來(lái)實(shí)現(xiàn)繼承的效果(目前還沒(méi)有實(shí)現(xiàn))
struct Button {
Widget //組合
title string
}
button := new_button('Click me')
button.set_pos(x, y)
泛型結(jié)構(gòu)體
結(jié)構(gòu)體標(biāo)注
-
結(jié)構(gòu)體的標(biāo)注
目前主要用在集成C代碼庫(kù),詳細(xì)參考:集成C代碼庫(kù)
-
結(jié)構(gòu)體字段的標(biāo)注
目前主要用于內(nèi)置json解析支持,詳細(xì)參考:json章節(jié)