go在方法中修改結構體的值_[Go]結構體及其方法

結構體類型可以包含若干字段,每個字段通常都需要有確切的名字和類型。也可以不包含任何字段,這樣并不是沒有意義的,因為還可以為這些類型關聯上一些方法,這里可以把方法看作事函數的特殊版本。

函數事獨立的程序實體,可以聲明有名字的函數,也可以聲明沒名字的函數,還可以把它們當作普通的值傳來傳去(把具有相同簽名的函數抽象陳獨立的函數類型,作為一組輸入或輸出的代表)。方法則不同,它需要名字,不能被當作值來看待,更重要的是,它必須隸屬于某一個類型。方法所屬的類型會通過期聲明中的接收者聲明(關鍵字func和方法名稱之間那個圓括號包裹起來的內容,其中必須包含確切的名稱和類型字面量,這個接收者的類型其實就是當前方法所屬的那個類型,而接收者的名稱則用于在當前方法中引用它所屬的類型的當前值)體現出來。

type AnimalCategory struct{

kingdomstring //界。

phylum string //門。

class string //綱。

order string //目。

family string //科。

genus string //屬。

species string //種。

}

func (ac AnimalCategory) String()string{return fmt.Sprintf("%s%s%s%s%s%s%s",

ac.kingdom, ac.phylum, ac.class, ac.order,

ac.family, ac.genus, ac.species)

}

從String方法的接收者聲明可以看出,它隸屬于AnimalCategory類型。通過該方法的接收者名稱ac,可以在其中引用到當前的任何一個字段或者調用到當前值的任何一個方法(包括string方法自己)。使用時可以這樣表示

category := AnimalCategory{species: "cat"}

fmt.Printf("The animal category: %s\n", category)

在Go語言中,可以通過為一個類型編寫名為String的方法,來自定義該類型的字符串表示形式,這個String方法不需要任何參數聲明,但需要一個string類型的結果聲明。正因為如此,在調用fmt.Print函數時,無需顯式調用它的string方法,fmt.Print會自己去尋找它。

方法隸屬的類型并不局限于結構圖,但必須時某個自定義的數據類型,并且不能時任何接口類型。一個數據類型關聯的所有方法,共同組成了該類型的方法集合。同一個方法集合中的方法不能出現重名,并且如果它們所屬的是一個結構圖類型,那么它們的名稱與該類型中任何字段的名稱也不能重復。

可以把結構體類型中的一個字段看作是它的一個屬性或一項數據,再把隸屬于它的一個方法看作是附加再其中數據之上的一個能力或一項操作。將屬性及其能力封裝再一起,是面向對象編程的一個主要原則。

1、結構體嵌入字段

Go語言規范規定,如果一個字段的聲明中只有字段的類型名而沒有字段的名稱,那么它就是一個嵌入字段。可以通過此類型變量的名稱后跟“.”,再后跟嵌入字段類型的方法引用到該字段。

type Animal struct{

scientificNamestring //學名。

AnimalCategory //動物基本分類。

}

func (a Animal) Category()string{returna.AnimalCategory.String()

}

Category方法的接收者類型是Animal,接收者名稱是a。在該方法中,通過表達式a.AnimalCategory選擇到了a這個嵌入字段,然后又選擇了該字段的String方法并調用了它。

把一個結構體類型嵌入到另一個結構體中的,嵌入字段的方法集合會被無條件地合并進被嵌入類型地方法集合中。

animal :=Animal{

scientificName:"American Shorthair",

AnimalCategory: category,

}

fmt.Printf("The animal: %s\n", animal)

這里聲明了Animal類型地變量animal并對它進行初始化,把字符串值“American Shorthair”賦值給它的字段scientificName,并把前面聲明過的變量category賦給它的嵌入字段AnimalCategory

那再后面使用fmt.Printf函數相當于調用animal的String方法(雖然還沒有為Animal類型編寫String方法,但這樣做并沒有問題,因為嵌入字段AnimalCategory的String方法會被當做animal的方法調用)

那如果為Animal類型也編寫一個String方法呢?會調用哪一個?

答案是animal的String方法會被調用,AnimalCategory的String方法被屏蔽掉了。注意:只要名稱相同,無論這兩個方法的簽名是否一致,被嵌入類型的方法都會屏蔽掉嵌入字段的同名方法。

同樣,如果兩個結構體類型中存在同名的字段,那嵌入字段中的那個字段一定會被“屏蔽‘。即使是兩個同名的成員,一個是字段,一個是方法,這種屏蔽現象依然會存在。

不過,即使被屏蔽了仍然可以通過鏈式的選擇表達式,選擇到嵌入字段的字段或方法。

當出現多層嵌入時,屏蔽現象會以嵌入的層級為依據,嵌入層級越深的字段或方法越可能被屏蔽。如果同一層級的多個嵌入字段擁有同名的字段或方法,那么被嵌入類型的值那里,選擇此名稱的時候就會引發一個編譯錯誤。

2、Go語言用嵌入字段實現了繼承嗎?

Go語言中根本沒有繼承的概念

它所做的事通過嵌入字段的方式實現了類型之間的組合。

面向對象編程中的繼承事通過犧牲一定的代碼簡潔性來換取可擴展性,這種可擴展性事通過侵入的方式實現的。

而類型之間的組合采用的是非聲明的方式。不需要顯式聲明,而且也非侵入式的。只是通過嵌入字段的方式把一個類型的屬性和能力嫁接給另外一個類型

3、值方法和指針方法都是什么意思?有什么區別

方法的接收者必須是某個自定義的數據類型,而且不能是接口類型或接口的指針類型。

值方法就是接收者是非指針的自定義數據類型的方法。前面的AnimalCategory、Animal聲明的那些方法都是值方法。

type Cat struct{

namestringAnimal

}

func (cat*Cat) SetName(name string) {

cat.name=name

}

方法SetName的接收者類型是*Cat(Cat類型的指針類型)。那指針方法,就是接收者類型是指針類型的方法

區別:

1)值方法的接收者是該方法所屬的那個類型值的一個副本,在該方法內對該副本的修改一般不不會體現在原值上(除非這個類型本身是某個引用類型(如切片或字典)的別名類型)。

指針方法的接收者,是該方法所屬那個基本類型值的指針值的一個副本,這樣的方法內對該副本指向值的進行修改,一定會體現在原值上。

(2)一個自定義數據類型的方法集合中僅會包含它的所有值方法

而該類型的指針類型的方法集合卻包含了所有值方法和所有指針方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542179.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

to_number用法示例_Number()函數以及JavaScript中的示例

to_number用法示例Number()函數 (Number() function) Number() function is a predefined global function in JavaScript, it used to convert an object to the number. If the function is not able to convert the object in a number – it returns "NaN". (Rea…

系統延時任務及定時任務

1. 系統延時任務&#xff1a; at相關命令 at time 設定任務執行時間at> rm -fr /mnt/* 任務動作at> <EOT> <<ctrld 執行任務at的命令&#xff1a; -l ##查看任務列表-c …

cpn tools查看運行時間_Jmeter在Linux下的運行測試

一、JMeterApache JMeter是Apache組織開發的基于Java的壓力測試工具。用于對軟件做壓力測試&#xff0c;它最初被設計用于Web應用測試&#xff0c;但后來擴展到其他測試領域。1.1、JMeter的作用能夠對HTTP和FTP服務器進行壓力和性能測試&#xff0c; 也可以對任何數據庫進行同樣…

css div滾動_如何使用CSS創建可垂直滾動的div?

css div滾動Introduction: 介紹&#xff1a; Dealing with divs has become a regularity and divs are used for many purposes like to structure our code and to segregate our various sections of codes. Besides, we are also aware of many properties that we can im…

Linux中磁盤分區的管理

1. 本地存儲設備的識別 fdisk -l真實存在的設備cat /proc/partitions系統識別的設備blkid系統可使用的設備df系統正在掛載的設備 真實存在的設備不一定可識別&#xff0c;識別到的的設備不一定可使用 2. 設備的掛載和卸載 1&#xff09;設備名稱 /dev/xdx …

python中時間的加減_python日期加減

python中關于時間和日期函數的常用計算總結 python中關于時間和日期函數有time和datatime 1.獲取當前時間的兩種方法: import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") print now now = datetime.datetime.now()... 文章 技術小胖子 2017-11-08 848…

bst 刪除節點_在BST中刪除大于或等于k的節點

bst 刪除節點Problem statement: 問題陳述&#xff1a; Given a BST and a value x, write a function to delete the nodes having values greater than or equal to x. The function will return the modified root. 給定一個BST和一個值x &#xff0c;編寫一個函數刪除值大…

游戲架構之二(轉)

棋牌類游戲常用架構&#xff1a; 我從事過4年的棋牌類游戲開發&#xff0c;使用過的架構大致如上&#xff0c;各模塊解釋如下。 LoginServer&#xff1a; 登陸服務器&#xff0c;主要負責player 的登陸請求&#xff0c;驗證player的合法性&#xff0c;為合法的player分配sessio…

對lvm介紹

1. 什么是LVM LVM是 Logical Volume Manager&#xff08;邏輯卷管理&#xff09;的簡寫&#xff0c;它是Linux環境下對磁盤分區進行管理的一種機制&#xff0c;用戶在無需停機的情況下可以方便地調整各個分區大小。 lvm中的一些常見符號及意義 pv物理卷被lv命令處理過的物理分…

pythonweb自動化測試實例_[轉載]python?webdriver自動化測試實例

python webdriver自動化測試初步印象以下示例演示啟動firefox&#xff0c;瀏覽google.com,搜索Cheese&#xff0c;等待搜索結果&#xff0c;然后打印出搜索結果頁的標題from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.w…

repeated_Ruby中帶有示例的Array.repeated_combination()方法

repeatedArray.repeated_combination()方法 (Array.repeated_combination() Method) In this article, we will study about Array.repeated_combination() method. You all must be thinking the method must be doing something which is related to creating combinations o…

ApacheHttpServer修改httpd.conf配置文件

轉自&#xff1a;https://blog.csdn.net/dream1120757048/article/details/77427351 1. 安裝完 Apache HTTP Server 之后&#xff0c;還需要修改一下配置文件。 Apache 的配置文件路徑如下&#xff1a; C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf…

大學物理實驗電學基本參數的測量實驗報告_大學物理電學實驗報告

技校網專門為您推薦的類似問題答案問題1&#xff1a;怎樣寫大學計算機基礎有關制作個人簡歷的實驗報告一、實驗名稱&#xff1a;個人簡歷的制作 二、實驗目的與要求: 1、熟悉Word 2003的基本操作 2、掌握利用網絡搜索獲得個人簡歷所需的資料 3、培養同學們動手能力和自學能力。…

python 線程模塊_Python線程模塊| main_thread()方法與示例

python 線程模塊Python threading.main_thread()方法 (Python threading.main_thread() Method) main_thread() is an inbuilt method of the threading module in Python. It is used to return the main Thread object. It is the thread from which the Python interpreter …

linux中系統修復

1. 引導文件丟失 &#xff08;1&#xff09;引導文件所在路徑 /boot/grub2/grub.cfg 需提前知道根目錄所在分區和內核版本 uname -r 查詢內核版本命令 模擬問題 rm -fr /boot/grub2/grub.cfg 一不小心把這玩意兒給刪了&#xff0c;還reboot了 完了以后機子開不了了就這情況 …

dw相對路徑怎么改_密云ETL怎么收費

密云ETL怎么收費&#xff0c;派客動力&#xff0c;公司依托自有產品&#xff0c;整合行業資源&#xff0c;構建先進的數據管理解決方案&#xff0c;解決企業和組織的核心數據問題以及被影響的業務挑戰。這種工具我都使用過&#xff0c;優點有&#xff1a;圖形界面&#xff0c;開…

python 自動化之路 day 08_2 網絡編程

本節內容 Socket介紹Socket參數介紹基本Socket實例Socket實現多連接處理通過Socket實現簡單SSH通過Socket實現文件傳送作業&#xff1a;開發一個支持多用戶在線的FTP程序1. Socket介紹 概念 A network socket is an endpoint of a connection across a computer network. Today…

查看scala變量數據類型_Scala文字,變量和數據類型| Scala編程教程

查看scala變量數據類型1)Scala數據類型 (1) Scala Data Types) Scala has the same set of data types as in Java. The traditional 14 data types are inherited as it is in Scala. Scala具有與Java中相同的數據類型集。 傳統的14種數據類型在Scala中被繼承。 The Followin…

Elasticsearch過濾與聚合的先后順序java實現

2019獨角獸企業重金招聘Python工程師標準>>> 一、Elasticsearch的聚合 ES的聚合相當于關系型數據庫里面的group by&#xff0c;例如查找在性別字段男女人數的多少并且按照人數的多少進行排序&#xff0c;在使用MySQL的時候&#xff0c;可以使用如下的句子 select se…

js手機號中間四位_11位手機號碼隱藏中間四位數,學會Substitute函數一鍵搞定!...

相信許多朋友都有見過手機號碼被*號隱藏中間四位數的情況。許多地方為了保護個人信息&#xff0c;都會將手機號的中間四位數用星號代替。如上圖所示&#xff0c;我們需要將原來的手機號碼&#xff0c;通過*號的方式變為隱藏后的加密模式。下面我們就來學習一下如何利用substitu…