欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

golang結(jié)構(gòu)體實(shí)例代碼

馬哥Linux運(yùn)維 ? 來源:稀土掘金 ? 2023-11-28 10:35 ? 次閱讀

struct概述

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

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

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

直接說語(yǔ)法往往非??菰铮谡介_始前,我們先來看一段簡(jiǎn)單的結(jié)構(gòu)體代碼,建立整體感知,后續(xù)我們?cè)僖灰患?xì)說其中的知識(shí)點(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()
}

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

1.1 如何定義

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

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

1.2 實(shí)例化

主要有幾種方式:


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


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

p := Person{"zhangsan", 18}

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

1.3 方法

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

在上例中,如下部分:


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),無(wú)論接收者是值類型還是指針類型,它們?cè)谡{(diào)用上卻不會(huì)有任何區(qū)別,這是因?yàn)間o編譯器會(huì)悄悄自動(dòng)幫我轉(zhuǎn)換, nice!

1.5 指針接收者or值接收者

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

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

值接收者:結(jié)構(gòu)體相對(duì)較?。截惓杀静桓撸恍枰淖兘Y(jié)構(gòu)體內(nèi)部值場(chǎng)景

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

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)體嵌套

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


type Person struct {
  Name string 
  Age  int8   
}

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

我們會(huì)發(fā)現(xiàn)學(xué)生結(jié)構(gòu)體和人結(jié)構(gòu)體相比只多了兩個(gè)字段(ID和Score)分別定義有點(diǎn)浪費(fèi)?另外人和學(xué)生有許多相似的地方,某些時(shí)候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)體嵌套,會(huì)有如下效果:

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

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

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

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

數(shù)據(jù)庫(kù)表設(shè)計(jì)中: 我們可以把常用的字段抽出來成一個(gè)結(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) 
}

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

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

審核編輯:黃飛

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

原文標(biāo)題:golang結(jié)構(gòu)體看這篇就夠啦

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Golang接口的作用和應(yīng)用場(chǎng)景

    Golang(Go)作為一門現(xiàn)代的靜態(tài)類型編程語(yǔ)言,提供了許多強(qiáng)大的特性,其中之一便是接口(interface)。接口是Golang中的一個(gè)核心概念,它具有廣泛的應(yīng)用場(chǎng)景,可以幫助開發(fā)者實(shí)現(xiàn)代碼
    的頭像 發(fā)表于 12-05 10:44 ?1182次閱讀

    漫談C語(yǔ)言結(jié)構(gòu)

      相信大家對(duì)于結(jié)構(gòu)都不陌生。在此,分享出本人對(duì)c語(yǔ)言結(jié)構(gòu)的學(xué)習(xí)心得。如果你發(fā)現(xiàn)這個(gè)總結(jié)中有你以前所未掌握的,那本文也算是有點(diǎn)價(jià)值了。當(dāng)然,水平有限,若發(fā)現(xiàn)不足之處懇請(qǐng)指出。
    發(fā)表于 11-15 15:59

    請(qǐng)問怎么在樹莓派上從源代碼構(gòu)建Golang

    就是指導(dǎo)你如何在樹莓派上從源代碼來構(gòu)建Go語(yǔ)言。 Google暫時(shí)還沒有為樹莓派提供預(yù)構(gòu)建好的Golang二進(jìn)制包。盡管在寫作本文時(shí)已經(jīng)有一個(gè)針對(duì)Raspbian系統(tǒng)的Golang包了,但版本較老
    發(fā)表于 05-16 07:55

    串口傳輸結(jié)構(gòu)是什么意思

    串口傳輸 結(jié)構(gòu)就是 把結(jié)構(gòu) 轉(zhuǎn)換為 數(shù)組 ,然后傳輸 數(shù)組中的 char。即 struct- - - - - - ->> char [ ] ;然后 char
    發(fā)表于 07-14 08:34

    使用結(jié)構(gòu)的主要作用

    結(jié)構(gòu)作用(STM32)來源:正點(diǎn)原子MDK 中很多地方使用結(jié)構(gòu)以及結(jié)構(gòu)指針,下面總結(jié)一下其
    發(fā)表于 08-24 07:54

    消息隊(duì)列傳遞結(jié)構(gòu)指針和結(jié)構(gòu)異同

    FreeRTOS消息隊(duì)列 傳遞結(jié)構(gòu)指針和結(jié)構(gòu)異同1 消息隊(duì)列傳遞結(jié)構(gòu)指針和
    發(fā)表于 02-11 07:02

    利用golang優(yōu)雅的實(shí)現(xiàn)單實(shí)例分享

    1、利用golang優(yōu)雅的實(shí)現(xiàn)單實(shí)例平時(shí)編寫代碼過程中,經(jīng)常會(huì)遇到對(duì)于全局角度只需運(yùn)行一次的代碼,比如全局初始化操作,設(shè)計(jì)模式中的單例模式。針對(duì)單例模式,java中又出現(xiàn)了餓漢模式、懶
    發(fā)表于 10-17 16:46

    golang的調(diào)度模型-GPM 模型的源碼結(jié)構(gòu)

    【導(dǎo)讀】GMP 模型是讓 go 語(yǔ)言輕量快速高效的重要調(diào)度模型,本文從 GMP 源碼出發(fā)直觀地解析了這一模型。 這篇文章就來看看 golang 的調(diào)度模型-GPM 模型的源碼結(jié)構(gòu)。 Go 版本
    的頭像 發(fā)表于 07-06 11:55 ?2256次閱讀

    golang orm庫(kù)xorm的使用和項(xiàng)目結(jié)構(gòu)

    ? 本文介紹了 golang orm 庫(kù) xorm 的使用和項(xiàng)目結(jié)構(gòu)。 xorm 官方介紹:xorm 是一個(gè)簡(jiǎn)單而強(qiáng)大的 Go 語(yǔ)言 ORM 庫(kù)。 通過它可以使數(shù)據(jù)庫(kù)操作非常簡(jiǎn)便。xorm 的目標(biāo)
    的頭像 發(fā)表于 10-29 10:36 ?2890次閱讀
    <b class='flag-5'>golang</b> orm庫(kù)xorm的使用和項(xiàng)目<b class='flag-5'>結(jié)構(gòu)</b>

    鴻蒙應(yīng)用實(shí)例代碼

    鴻蒙應(yīng)用實(shí)例代碼,僅供參考。
    發(fā)表于 09-27 14:56 ?12次下載

    初探Golang內(nèi)聯(lián)

    今天我們來聊聊 Golang 中的內(nèi)聯(lián)。
    的頭像 發(fā)表于 12-13 09:51 ?998次閱讀

    解析Golang定時(shí)任務(wù)庫(kù)gron設(shè)計(jì)和原理

    正巧,最近看到了 gron 這個(gè)開源項(xiàng)目,它是用 Golang 實(shí)現(xiàn)一個(gè)并發(fā)安全的定時(shí)任務(wù)庫(kù)。實(shí)現(xiàn)非常簡(jiǎn)單精巧,代碼量也不多。今天我們就來一起結(jié)合源碼看一下,怎樣基于 Golang 的能力做出來一個(gè)【定時(shí)任務(wù)庫(kù)】。
    的頭像 發(fā)表于 12-15 13:57 ?1393次閱讀

    GoLang的安裝和使用

    GoLang的安裝和使用
    的頭像 發(fā)表于 01-13 14:06 ?1308次閱讀
    <b class='flag-5'>GoLang</b>的安裝和使用

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

    結(jié)構(gòu)是go語(yǔ)言最重要的數(shù)據(jù)結(jié)構(gòu)之一,go和其它編程語(yǔ)言不一樣,它沒有類的概念,類比過來struct就相當(dāng)于其它語(yǔ)言中的類,因此十分重要。
    的頭像 發(fā)表于 11-28 10:36 ?509次閱讀

    結(jié)構(gòu)與指針的關(guān)系

    指針則是指向結(jié)構(gòu)類型的指針,用于操作和訪問結(jié)構(gòu)的成員。下面我們將分別詳細(xì)解釋結(jié)構(gòu)
    的頭像 發(fā)表于 01-11 08:00 ?1083次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>與指針的關(guān)系