V語(yǔ)言學(xué)習(xí)筆記-10結(jié)構(gòu)體

結(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é)

結(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é)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容