亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

golang結(jié)構(gòu)體如何定義?如何使用呢?

馬哥Linux運(yùn)維 ? 來源:稀土掘金 ? 2023-11-28 10:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

struct概述

結(jié)構(gòu)體是go語言最重要的數(shù)據(jù)結(jié)構(gòu)之一,go和其它編程語言不一樣,它沒有類的概念,類比過來struct就相當(dāng)于其它語言中的類,因此十分重要。

結(jié)構(gòu)體這部分涉及到的知識點(diǎn)頁比較多,此文偏長,請耐心閱讀。

1. 認(rèn)識結(jié)構(gòu)體

直接說語法往往非??菰?,在正式開始前,我們先來看一段簡單的結(jié)構(gòu)體代碼,建立整體感知,后續(xù)我們再一一細(xì)說其中的知識點(diǎn)。


package main


import "fmt"




type Person struct {
  Name string 
  Age  int8   
}




func (p Person) GetName() {
  fmt.Printf("My name: %s
", p.Name)
}


func main() {
  p := Person{
    Name: "zhangsan",
    Age:  18,
  }


  p.GetName()
}


看到了吧,還是很簡單的,跟著注釋你大概已經(jīng)看懂了如何使用。下面我們拆分成知識點(diǎn)細(xì)細(xì)分析

1.1 如何定義

它按照如下方式定義(PS: 它還可以代標(biāo)簽,為簡單起見,這里暫且不討論)

type 結(jié)構(gòu)體名 struct {
  字段名1 字段類型1
  字段名2 字段類型2
  .....
}

1.2 實例化

主要有幾種方式:


var p = new(Person) 
var p Person        
var p = Person{}    




p := Person{
  Name: "zhangsan",
  Age:  18,
}




p := Person{"zhangsan", 18}

實際例化后我們可以通過obj.字段名的方式調(diào)出值,如上例中p.Name

1.3 方法

結(jié)構(gòu)體方法,對應(yīng)到面向?qū)ο笳Z言中就是實例方法.

在上例中,如下部分:


func (p Person) GetName() {
  fmt.Printf("My name: %s
", p.Name)
}



方法和函數(shù)有什么主要區(qū)別呢?

方法它有接收者,而函數(shù)沒有

1.4 接收者

接收者既可以是值也可以是指針類型,我們看下:


package main


import "fmt"




type Person struct {
  Name string 
  Age  int8   
}




func (p Person) GetName() {
  fmt.Printf("My name: %s
", p.Name)
}




func (p *Person) GetAge() {
  fmt.Printf("My age: %d
", p.Age)
}


func main() {
  p1 := Person{Name: "張三", Age: 18}  
  p2 := &Person{Name: "李四", Age: 16} 


  
  p1.GetName()
  p1.GetAge()


  fmt.Println("---------分割線-------")
  
  p2.GetName()
  p2.GetAge()
}

我們可以發(fā)現(xiàn),無論接收者是值類型還是指針類型,它們在調(diào)用上卻不會有任何區(qū)別,這是因為go編譯器會悄悄自動幫我轉(zhuǎn)換, nice!

1.5 指針接收者or值接收者

那么什么時候使用值接收者啥時候用指針接收者呢?

在go中一般約定,同一個struct接收者類型保持一致(要么全是指針接收者,要么全是值接收者

值接收者:結(jié)構(gòu)體相對較小(拷貝成本不高),不需要改變結(jié)構(gòu)體內(nèi)部值場景

指針接收者:結(jié)構(gòu)體比較大(拷貝成本高),需要改變結(jié)構(gòu)體內(nèi)部值場景

2. 匿名字段及嵌套

匿名字段可以說是結(jié)構(gòu)體最有用的功能,使用的地方比比皆是,下面我們來看下

2.1 匿名字段

所謂匿名字段指的是在結(jié)構(gòu)體中字段名可以不用顯示寫出來,比如:


package main


import "fmt"


type Data struct {
  uint8 
        
}


func main() {
  d := Data{8}
  
  fmt.Println(d.uint8)
}


關(guān)鍵點(diǎn)在于字段名 == 類型名

2.2 結(jié)構(gòu)體嵌套

在開始之前我們來看下兩個結(jié)構(gòu)體


type Person struct {
  Name string 
  Age  int8   
}




type Student struct {
  ID    int     
  Name  string  
  Age   int8    
  Score float32 
}

我們會發(fā)現(xiàn)學(xué)生結(jié)構(gòu)體和人結(jié)構(gòu)體相比只多了兩個字段(ID和Score)分別定義有點(diǎn)浪費(fèi)?另外人和學(xué)生有許多相似的地方,某些時候Person結(jié)構(gòu)體中的方法,Student同樣也需要,如果分別寫兩份相同的方法,也很浪費(fèi)?

好啦!在go中可以通過嵌套解決,直接看代碼


package main


import "fmt"


type Person struct {
  Name string 
  Age  int8   
}




func (p Person) GetName() {
  fmt.Printf("My name: %s
", p.Name)
}


type Student struct {
  ID     int     
  Score  float32 
  Person         
}


func (s Student) GetScore() {
  fmt.Printf("My score: %v
", s.Score)
}


func main() {
  p := Student{
    ID:    1,
    Score: 98,
    Person: Person{ 
      Name: "zhangsan",
      Age:  18,
    },
  }


  
  fmt.Printf("My age: %d
", p.Age)                     
  fmt.Printf("My age p.Person.age: %d
", p.Person.Age) 


  p.GetScore()       
  p.GetName()        
  p.Person.GetName() 
}

上面的注釋已經(jīng)非常詳細(xì),這里總結(jié)下規(guī)律:

匿名結(jié)構(gòu)體嵌套,會有如下效果:

匿名結(jié)構(gòu)體中字段,當(dāng)前結(jié)構(gòu)體可以直接調(diào)用

匿名結(jié)構(gòu)體方法,當(dāng)前結(jié)構(gòu)體可以直接調(diào)用

本質(zhì)是:go在字段查找時,現(xiàn)在本結(jié)構(gòu)體中找,如果找不到則到匿名結(jié)構(gòu)體中查找;方法同理

2.3 匿名結(jié)構(gòu)體嵌套經(jīng)典使用

數(shù)據(jù)庫表設(shè)計中: 我們可以把常用的字段抽出來成一個結(jié)構(gòu)體,其它結(jié)構(gòu)體只需要引入就可以擴(kuò)展其中字段以及方法,比如:


package main


import (
  "fmt"
  "time"
)


type BaseTable struct {
  ID        int
  CreatedAt time.Time
  UpdatedAt time.Time
}


type User struct {
  Name      string
  BaseTable 
}

3. 方法值和方法表達(dá)式

方法值和方法表達(dá)式類似于函數(shù)表達(dá)式,我們可以將函數(shù)表達(dá)式當(dāng)作變量傳遞,方法值和方法表達(dá)式也是一樣,文字上不太容易明白,直接看代碼


package main


import (
  "fmt"
)


type Person struct {
  Name string
  Age  int8
}


func (p Person) GetName() {
  fmt.Printf("My name: %s
", p.Name)
}


func main() {
  p := Person{Name: "zhangsan", Age: 18}


  
  getName := p.GetName
  getName() 


  fmt.Println("--------分割線-------")
  
  pGetName := Person.GetName
  pGetName(p) 
}

它可以做為變量取出,因此可以實現(xiàn)復(fù)雜精巧場景下的使用,舉例這里不做舉例,方法值和方法表達(dá)式的區(qū)別在于:

方法表達(dá)式需要把接收者做為參數(shù)傳入







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1956

    瀏覽量

    36644
  • go語言
    +關(guān)注

    關(guān)注

    1

    文章

    159

    瀏覽量

    9370
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    為什么stm32宏定義結(jié)構(gòu)成員是16位的?

    本帖最后由 Mrcharacter 于 2017-8-1 23:25 編輯 大家都知道stm32的庫里的寄存器是用結(jié)構(gòu)來對應(yīng)的,比如定義USART1_BASE對應(yīng)USART的外設(shè)地址
    發(fā)表于 08-01 23:23

    結(jié)構(gòu)-共用和用戶定義類型

    結(jié)構(gòu)-共用和用戶定義類型
    發(fā)表于 01-31 10:48

    ccs程序在結(jié)構(gòu)后面打上點(diǎn)(.)后結(jié)構(gòu)成員不出現(xiàn)

    在編譯器中定義結(jié)構(gòu),在結(jié)構(gòu)后面打上點(diǎn)(.)后,結(jié)構(gòu)
    發(fā)表于 09-29 15:05

    如何定義結(jié)構(gòu)?

    什么是結(jié)構(gòu),如何定義結(jié)構(gòu)? 溫馨提示: 請從以下鏈接中的帖子學(xué)習(xí)相關(guān)內(nèi)容并進(jìn)行回答,其他地方得到的答案不能作為標(biāo)準(zhǔn)答案,僅能做為補(bǔ)
    發(fā)表于 05-08 05:55

    GPIO結(jié)構(gòu)定義

    #include "stm32f4xx.h"#include "usart.h"void My_USART1_Init(void){//GPIO結(jié)構(gòu)定義 GPIO_InitTypeDefGPIO_InitStructure;/
    發(fā)表于 08-04 07:47

    pid結(jié)構(gòu)定義

    首先定義pid結(jié)構(gòu):typedef struct PID{long SumError;//誤差累計int32 LastError;//Error[-1]int32 PrevError
    發(fā)表于 09-16 07:41

    怎樣去定義一個結(jié)構(gòu)數(shù)組

    數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)有哪些?怎樣去定義一個結(jié)構(gòu)數(shù)組?
    發(fā)表于 10-14 07:25

    My_Struct這個結(jié)構(gòu)占用多少內(nèi)存

    從一個結(jié)構(gòu)說起。如下,在 STM32F0 的程序中,我們定義了一個結(jié)構(gòu)My_Struct ,那么這個
    發(fā)表于 11-03 06:30

    結(jié)構(gòu)類型定義的一般格式

    它是將若干個不同類型的數(shù)據(jù)變量有序地組合在一起而形成的一種數(shù)據(jù)集合體。一般來說,結(jié)構(gòu)中各個變量之間是存在某些聯(lián)系的,例如時間的時分秒,日期中的年月日1.結(jié)構(gòu)
    發(fā)表于 12-08 07:13

    結(jié)構(gòu)變量的定義與使用變量訪問結(jié)構(gòu)成員

    知識點(diǎn)回顧關(guān)于找最大公共子串的兩種解題方法結(jié)構(gòu)定義(3種)結(jié)構(gòu)變量的定義與使用變量訪問
    發(fā)表于 12-17 07:10

    怎樣去使用C語言的結(jié)構(gòu)和共用

    C語言的結(jié)構(gòu)和共用分別有何特點(diǎn)?怎樣去使用C語言的結(jié)構(gòu)和共用
    發(fā)表于 01-17 07:51

    怎么去解決結(jié)構(gòu)指針宏定義錯誤的問題

    error:expected identifier before ‘(’ token,結(jié)構(gòu)指針宏定義錯誤編譯時彈出標(biāo)題所示錯誤,一般為宏定義里有與其他地方重復(fù)的常量符號。找出名字重復(fù)
    發(fā)表于 02-28 07:22

    PIC結(jié)構(gòu)定義位元結(jié)構(gòu)

    PIC結(jié)構(gòu)定義位元結(jié)構(gòu) extern volatile near unsigned char PORTB;   // PORTB是一個字節(jié)(unsigned c
    發(fā)表于 10-30 08:28 ?2811次閱讀

    結(jié)構(gòu)定義、初始化和賦值

    type)的一類。結(jié)構(gòu)可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)同時也是一些元素的集合,這些元素稱為
    發(fā)表于 11-20 09:29 ?5.6w次閱讀

    C語言如何定義結(jié)構(gòu)類型變量

    定義結(jié)構(gòu)變量后,系統(tǒng)會為之分配內(nèi)存單元。根據(jù)結(jié)構(gòu)類型中包含的成員情況,在Visual C++中占63個字節(jié)。 * 這種聲明方式是聲
    的頭像 發(fā)表于 03-10 15:35 ?1878次閱讀