結(jié)構(gòu)體(struct)是用戶自定義的類型,它代表若干字段的集合,可以用于描述一個(gè)實(shí)體對(duì)象,類似Java中的class,是golang面向?qū)ο缶幊痰幕A(chǔ)。
結(jié)構(gòu)體的概念在軟件工程上的舊術(shù)語(yǔ)是ADT(抽象數(shù)據(jù)類型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向?qū)ο蟮木幊陶Z(yǔ)言中,跟一個(gè)無(wú)方法的輕量級(jí)類一樣。因?yàn)樵贕o語(yǔ)言中沒(méi)有類的概念,所以在go中結(jié)構(gòu)體有著很重要的地位。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、天等網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、天等網(wǎng)絡(luò)營(yíng)銷、天等企業(yè)策劃、天等品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供天等建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:sd-ha.com
type Coordinate struct {
X,Y float32
}
上述代碼定義了一個(gè)名為Coordinate的結(jié)構(gòu)體,里面包括了兩個(gè)float32的變量X,Y。該結(jié)構(gòu)體可用于描述一個(gè)平面坐標(biāo)。
在go語(yǔ)言中,對(duì)象方法在結(jié)構(gòu)體定義的外部添加
type Coordinate struct {
X,Y float32
}
func (coo *Coordinate) GetCoordinate() {
fmt.Printf("(%.2f, %.2f)\n", coo.X, coo.Y)
return
}
其中,func關(guān)鍵字后面的(coo *Coordinate),表示該函數(shù)傳入一個(gè)指向Coordinate的指針,可通過(guò)指針變量coo來(lái)操作結(jié)構(gòu)體的值。
package main
import (
"fmt"
)
func main(){
p0 := Coordinate{1,2}
p0.GetCoordinate()
}
輸出:(1.00, 2.00),其中X=1,Y=2
2.按照自定義字段順序進(jìn)行初始化
package main
import (
"fmt"
)
func main(){
p0 := Coordinate{Y:1, X:2}
p0.GetCoordinate()
}
輸出:(2.00,1.00),其中X=2,Y=1
3.通過(guò)new函數(shù)創(chuàng)建
package main
import (
"fmt"
)
func main(){
p0 := new(Coordinate)
P0.X=1
p0.Y=2
p0.GetCoordinate()
}
其中p0 := new(Coordinate)等價(jià)于以下寫法
p3 := &Coordinate{X:1,Y:2}
p3 := &Coordinate{1,2}
比較三種創(chuàng)建方式,其中,第一種和第二種,p0均為一個(gè)類型為Coordinate的實(shí)例,而第三種p0為一個(gè)指向Coordinate的指針,相當(dāng)于 var p0 *Coordinate = new(Coordinate)
剛才說(shuō)了,添加一個(gè)對(duì)象方法,可以通過(guò)func (t *T) functionname() 來(lái)創(chuàng)建,其中t是一個(gè)指針變量。我們也可以通過(guò)值拷貝的方法,添加一個(gè)對(duì)象方法,語(yǔ)法為 func(t T) functionname()
package main
import (
"fmt"
)
type Coordinate struct {
X, Y float32
}
func (coo *Coordinate) GetCoordinate() {
fmt.Printf("(%.2f,%.2f)\n", coo.X, coo.Y)
return
}
//值拷貝對(duì)象方法
func (coo Coordinate) SetPosition01(a float32,b float32) {
coo.X = a
coo.Y = b
}
//指針變量對(duì)象方法
func (coo *Coordinate) SetPosition02(a float32,b float32) {
coo.X = a
coo.Y = b
}
func main(){
p0 := Coordinate{1, 2}
fmt.Print("SetPosition02調(diào)用前:")
p0.GetCoordinate()
p0.SetPosition02(0, 0)
fmt.Print("SetPosition02調(diào)用后:")
p0.GetCoordinate()
}
輸出:
SetPosition01調(diào)用前:(1.00,2.00)
SetPosition01調(diào)用后:(1.00,2.00)
SetPosition02調(diào)用前:(1.00,2.00)
SetPosition02調(diào)用后:(0.00,0.00)
從程序輸出中可以看出,調(diào)用SetPosition01方法,發(fā)生了值拷貝,即使在方法內(nèi)改變了coo的值,外部的p0的值沒(méi)有被改變。而SetPosition02方法中,coo為指向p0地址的指針,由于是通過(guò)指針變量修改了X,Y的值,所以調(diào)用完畢后,外部p0的值會(huì)被修改為(0,0)
package main
import (
"fmt"
)
func main(){
p_3d := struct {
X,Y,Z float32
}{1,2,3}
fmt.Println("------輸出p_3d--------")
fmt.Printf("%v\n%T\n",p_3d, p_3d)
}
輸出為:
-------輸出p_3d-------
{1 2 3}
struct { X float32; Y float32; Z float32 }
Go語(yǔ)言的結(jié)構(gòu)體沒(méi)有構(gòu)造函數(shù),我們可以自己實(shí)現(xiàn)。 例如,下方的代碼就實(shí)現(xiàn)了一個(gè)person的構(gòu)造函數(shù)。 因?yàn)閟truct是值類型,如果結(jié)構(gòu)體比較復(fù)雜的話,值拷貝性能開(kāi)銷會(huì)比較大,所以該構(gòu)造函數(shù)返回的是結(jié)構(gòu)體指針類型。
func newPerson(name, city string, age int8) *person {
return &person{
name: name,
city: city,
age: age,
}
}
調(diào)用構(gòu)造函數(shù)
p9 := newPerson("張三", "沙河", 90)
fmt.Printf("%#v\n", p9) //&main.person{name:"張三", city:"沙河", age:90}
文章標(biāo)題:golang碎片整理之結(jié)構(gòu)體
轉(zhuǎn)載來(lái)源:http://sd-ha.com/article32/iheesc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、定制開(kāi)發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)