亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文帶你了解Go語言中的指針和結構體

 更新時間:2022年11月28日 11:22:40   作者:陳明勇  
前面的兩篇文章對?Go?語言的基礎語法和基本數據類型以及幾個復合數據類型進行介紹,本文將對?Go?里面的指針和結構體進行介紹,也為后續(xù)文章做鋪墊,感興趣的可以了解一下

前言

前面的兩篇文章對 Go 語言的基礎語法和基本數據類型以及幾個復合數據類型進行介紹,本文將對 Go 里面的指針和結構體進行介紹,也為后續(xù)文章做鋪墊。

指針

Go 語言中,指針可以簡單理解是一個地址,指針類型是依托于某一個類型而存在的,例如 Go 里面的基本數據類型 int、float64、string 等,它們所對應的指針類型為 *int、*float64、*string等。

指針的定義

語法格式:var 指針變量名 *數據類型 = &變量。

& 為取地址符號,通過 & 符號獲取某個變量的地址,然后賦值給指針變量。

import (
	"fmt"
)

func main() {
	var num int = 666
	var numPtr *int = &num
	fmt.Println(numPtr)  // num 變量的地址值 0xc00001c098
	fmt.Println(&numPtr) // 指針變量本身的地址值 0xc00000a028
}

npmPtr 指針變量指向變量 num,0xc00001c098num 變量的地址,0xc00000a028 為指針變量本身的地址值。

使用 new(T) 函數創(chuàng)建指針變量

import (
	"fmt"
)

func main() {
	numPtr := new(int)
	fmt.Println(numPtr)  // 0xc000122058
	fmt.Println(*numPtr) // 0
}

new(T) 函數為每個類型分配一片內存,內存單元保存的是對應類型的零值,函數返回一個指針類型。

錯誤的類型地址賦值

func main() {
	var num float64 = 666
	var numPtr *int = &num // cannot use &num (value of type *float64) as type *int in variable declaration
}

當指針所依托的類型與變量的類型不一致時,Go 編譯器會報錯,類型不匹配。

獲取和修改指針所指向變量的值

通過指針獲取所指向變量的值

func main() {
	var num int = 666
	var numPtr *int = &num

	// 獲取 num 的值
	fmt.Println(*numPtr) // 666
}

對指針使用 * 操作符可以獲取所指向變量的值。

通過指針修改所指向變量的值

import (
	"fmt"
)

func main() {
	var num int = 666
	var numPtr *int = &num

	// 修改 num 的值
	*numPtr = 555
	fmt.Println(num) // 555
}

同時也可以對指針使用 * 操作符修改所指向變量的值。

結構體

通過上一篇文章,我們了解了數組和切片的特點,它們可以存儲一組相同類型的數據,而結構體,它可以由 0 個或多個字段組成,每個字段的數據類型可以一樣,也可以不一樣。結構體可以表示一個對象,例如:人,人包含的一些字段有姓名、性別和年齡等。

結構體定義

語法格式:

type XXX struct {
	/*
	結構體字段定義區(qū)域
	*/
}

XXX 為結構體的名字,下面以人為對象,引入結構體

// Person定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

上述代碼定義了人的結構體 Person,包含四個字段,字段的命名規(guī)則和變量是一樣的,前三個字段首字母大寫,可以被包外訪問,第四個字段首字母小寫,表示只能在包內訪問。 除了上述的定義方式以外,結構體里還可以內嵌結構體

// Person 定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

// Phone 手機結構體
type Phone struct {
	// 品牌
	Brand string
	// 擁有者
	Owner Person
}

上述代碼定義了 Person 結構體和 Phone 結構體,Phone 結構體擁有兩個字段,分別為 Brand 品牌和 Owner 擁有者,Owner 屬性的類型,指定為我們所自定義的 Person 結構體。以這種方式定義的結構體字段,我們可以稱為嵌入字段(Embedded Field)。也可以將這種字段稱為匿名字段。

結構體的創(chuàng)建方式

1、聲明一個結構體變量

// Person 定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

func main() {
	var person Person
	fmt.Println(person.Name)     // ""
	fmt.Println(person.Age)      // 0
	fmt.Println(person.Sex)      // ""
	fmt.Println(person.idNumber) // ""

	// 修改結構體字段的值
	person.Name = "chenmingyong"
	fmt.Println(person.Name) // "chenmingyong"
}

通過聲明一個結構體變量,隱式創(chuàng)建一個結構體變量,這個結構體變量各個字段值默認為零值,也就是對應類型的默認值。

結構體屬性的值,可以通過 變量.字段名 的方式獲取,同時也可以通過此方式對字段值進行修改。

2、使用復合字面值進行顯式初始化結構體對象

import "fmt"

// Person 定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

func main() {
	person := Person{
		"chenmingyong",
		18,
		"男",
		"xxxxxxxxx",
	}

	fmt.Println(person) // {chenmingyong 18 男 xxxxxxxxx}
}

上述代碼根據字段的順序進行賦值,實際上,Go 語言并不推薦我們用這種方式進行賦值,因為可能會帶來一些問題,例如結構體的某個中間的字段被刪除或者字段的順序改變了,那么我們需要維護對應代碼,調整賦值的順序。

上述創(chuàng)建結構體的方式有弊端,因此我們需要換一種方法,如下第三種方法。

3、 使用 field:value 形式的復合字面值進行顯式初始化結構體對象

import "fmt"

// Person 定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

func main() {
	person := Person{
	    Sex:      "男",
	    Age:      18,
	    Name:     "chenmingyong",
	    idNumber: "xxxxxxxxx",
    }

	fmt.Println(person) // {chenmingyong 18 男 xxxxxxxxx}
}

通過以上的方式,我們就不被字段的順序所約束了。

4、通過 new(T) 函數創(chuàng)建結構體指針

// Person 定義一個人的結構體
type Person struct {
	// 姓名
	Name string
	// 年齡
	Age int
	// 性別
	Sex string
	// 身份證號
	idNumber string
}

func main() {
	person := new(Person)
	(*person).Name = "chenmignyong"
	fmt.Println((*person).Name) // chenmignyong
	// 簡化賦值,底層自動轉換成 (*person).Age = 18
	person.Age = 18
	fmt.Println(person.Age) // 18
}

前面提到過,訪問指針所指向變量的值,需要使用 * 操作符,但在結構體這里有點特殊,如果不加 * 的話,底層會將 person.Age = 18 轉成 (*person).Age = 18。

小結

本文對指針和結構體進行了介紹,也指出使用指針和結構體時需要注意的一些地方。因為本文是基于了解的層面去寫的文章,一些深入的知識并沒有提到,然后也沒有提到結構體的方法,是因為打算留到后面和函數一起去介紹。

到此這篇關于一文帶你了解Go語言中的指針和結構體的文章就介紹到這了,更多相關Go語言指針 結構體內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • GO語言的map類型實例詳解

    GO語言的map類型實例詳解

    這篇文章主要介紹了GO語言的map類型實例詳解,包括對map的創(chuàng)建,賦值,排序,刪除,等操作需要的朋友可以參考下
    2022-12-12
  • Golang的第一個程序-Hello?World

    Golang的第一個程序-Hello?World

    這篇文章主要介紹了第一個Go程序-Hello?World,在編寫第一個go程序之前,我們要將系統(tǒng)的環(huán)境變量配好,下面來看具體的編一過程吧,需要的小伙伴可以參考一下
    2022-01-01
  • Golang操作excel的技巧與方法

    Golang操作excel的技巧與方法

    在Golang中操作Excel可以包括讀取、寫入和編輯Excel文件,你可以定義函數或方法來執(zhí)行這些操作,本文給大家介紹了Golang操作excel的技巧與方法,文中有詳細的代碼講解,需要的朋友可以參考下
    2024-05-05
  • golang如何使用gos7讀取S7200Smart數據

    golang如何使用gos7讀取S7200Smart數據

    文章介紹了如何使用Golang語言的Gos7工具庫讀取西門子S7200Smart系列PLC的數據,通過指定數據塊號、起始字節(jié)偏移量和數據長度,可以精確讀取所需的數據,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • go?time.After優(yōu)化后性能提升34%內存減少67%

    go?time.After優(yōu)化后性能提升34%內存減少67%

    這篇文章主要介紹了go語言time.After優(yōu)化后性能提升34%內存減少67%實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 基于Go編寫一個可視化Navicat本地密碼解析器

    基于Go編寫一個可視化Navicat本地密碼解析器

    這篇文章主要給大家介紹了基于Go編寫一個可視化Navicat本地密碼解析器的方法,文中有詳細的代碼示例和圖文介紹,有需要的朋友可以參考閱讀本文
    2023-08-08
  • Golang 并發(fā)的實現

    Golang 并發(fā)的實現

    本文主要介紹了Golang 并發(fā)的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Golang使用Swag搭建api文檔的全過程

    Golang使用Swag搭建api文檔的全過程

    Gin是Golang目前最為常用的Web框架之一,公司項目驗收需要API接口設計說明書(Golang后端服務基于Gin框架編寫),所以本文給大家介紹了Golang使用Swag搭建api文檔的全過程,需要的朋友可以參考下
    2024-02-02
  • 讀取Go項目中的配置文件的方法

    讀取Go項目中的配置文件的方法

    本文主要介紹了讀取Go項目中的配置文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 使用Golang開發(fā)一個簡易版shell

    使用Golang開發(fā)一個簡易版shell

    這篇文章主要為大家詳細介紹了如何使用Golang開發(fā)一個簡易版shell,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02

最新評論