欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中的struct操作

 更新時間:2021年11月10日 11:29:13   作者:老朱.  
結(jié)構(gòu)體是一種聚合的數(shù)據(jù)類型,是由零個或多個任意類型的值聚合成的實體,每個值稱為結(jié)構(gòu)體的成員。下面介紹下golang中的struct,感興趣的朋友一起看看吧

struct是實現(xiàn)面向?qū)ο蟮闹匾夹g(shù),基本上都跟類型聲明type name underlying-type結(jié)合使用。

struct是值類型,所以它的零值是所有成員的零值。由于值類型在作為函數(shù)參數(shù)時的局限性,所以經(jīng)常配合指針一起使用。

聲明

type Employee struct {
    ID      int
    Name    string
    Address string
}

一行一個成員,中間沒有逗號或分號,大寫的成員可以在包外訪問。

如果類型相同,也可以考慮定義在一行,例如

type Employee struct {
    ID            int
    Name, Address string
}

結(jié)構(gòu)體中不能定義同名結(jié)構(gòu)體的成員,但可以定義同名結(jié)構(gòu)體的指針類型的成員,例如

type Employee struct {
    ID            int
    Name, Address string
	   Leader        *Employee		
}

初始化

可以在聲明時直接初始化,也可以聲明后再一個個賦值。先看一個最直接的方式。

var empl Employee
empl.ID = 1
empl.Name = "foo"
empl.Address = "nanshan"

還可以更快地初始化

empl2 := Employee{2, "foo", "nanshan"}

所以,聲明成員的順序非常重要。上面初始化的值必須與struct的成員一一對應(yīng),不多不少,類型上可賦值。

由于struct成員可能會調(diào)整,所以上面的代碼就顯得有些脆弱,下面改進一下,按照成員名稱來初始化。

empl3 := &Employee{
    ID:      3,
    Name:    "foo",
    Address: "beijing",
}

這時候順序不重要了,也不要求我完整性了,未直接賦值的成員繼續(xù)保留零值。

與指針相關(guān)的操作

由于struct是值類型,如果作為參數(shù)傳遞的話,函數(shù)體內(nèi)接收到的是一個拷貝,所以作為函數(shù)的參數(shù)時一般用結(jié)構(gòu)體指針來傳遞。

emplPtr := &empl
emplPtr.Name = "bar" 		// 等同于 (*emplPtr).Name = "bar"

在使用struct指針類型的變量時,可以省略*,看上去就像struct是引用類型一樣,其實它是一個結(jié)構(gòu)體指針。

下面的函數(shù)初始化一個struct,并返回了它的指針

func EmployeeById(id int) *Employee {
    return &Employee{
        ID:      id,
        Name:    "foo",
        Address: "beijing",
    }
}

struct的可比較性

如果struct的每個成員都是可比較的,那么這個結(jié)構(gòu)體就是可比較的。

比較算法為:如果每個成員的值都相等,則兩個結(jié)構(gòu)體變量相等,否則不相等。

如果結(jié)構(gòu)體類型是可比較的,就意味著它可以作為map的key類型。

結(jié)構(gòu)體嵌套和匿名成員

這是一個神奇的機制,當在結(jié)構(gòu)體里面聲明一個匿名結(jié)構(gòu)體時,使用這個匿名結(jié)構(gòu)體的成員時,就可以省略匿名結(jié)構(gòu)體的名字,就好像當前的結(jié)構(gòu)體擁有這個匿名結(jié)構(gòu)體的成員一樣。

下面的結(jié)構(gòu)體,EmployeeManager,將上面的結(jié)構(gòu)體Employee作為一個匿名成員

type EmployeeManager struct {
    Employee                // 匿名成員
    ManagerLevel int
}

初始化匿名成員:

var manager = EmployeeManager{
    Employee: Employee{
        ID:      2,
        Name:    "fooManager",
        Address: "beijing",
    },
    ManagerLevel: 4,
}

看上去中規(guī)中矩,沒有什么神奇的。再來看看如何使用這個結(jié)構(gòu)體

fmt.Println(manager.ManagerLevel)
fmt.Println(manager.Name)				//這一行
fmt.Println(manager.Employee.Name)		//等同于這一行

這么折騰,不僅是一種簡化,更重要的是,我看出來了繼承的味道,但從技術(shù)上看又不存在繼承,而是組合,它即享受了繼承的好處,又避免了繼承的麻煩。

使用匿名結(jié)構(gòu)體時,除了可以直接使用它的屬性以外,還可以直接使用它的方法。

到此這篇關(guān)于golang中的struct的文章就介紹到這了,更多相關(guān)golang中struct內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實現(xiàn)callerSkip詳解

    go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實現(xiàn)callerSkip詳解

    這篇文章主要為大家介紹了go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實現(xiàn)callerSkip詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 詳解Go語言中的Slice鏈式操作

    詳解Go語言中的Slice鏈式操作

    這篇文章主要為大家詳細介紹了Go語言中的Slice鏈式操作的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • 使用golang進行http,get或postJson請求

    使用golang進行http,get或postJson請求

    這篇文章主要為大家詳細介紹了如何使用golang進行http,get或postJson請求,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-12-12
  • Go語言resty http包調(diào)用jenkins api實例

    Go語言resty http包調(diào)用jenkins api實例

    這篇文章主要為大家介紹了Go語言resty http包調(diào)用jenkins api實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • uber go zap 日志框架支持異步日志輸出

    uber go zap 日志框架支持異步日志輸出

    這篇文章主要為大家介紹了uber go zap 日志框架支持異步日志輸出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 最新評論