Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解
1. 結(jié)構(gòu)體別名定義
變量別名定義
package main
import "fmt"
type integer int
func main() {
//類(lèi)型別名定義
var i integer = 1000
fmt.Printf("值: %d, 類(lèi)型: %T\n", i, i)
var j int = 100
j = int(i) //j和i不屬于同一類(lèi)型,需要轉(zhuǎn)換
fmt.Println(j)
}輸出結(jié)果如下
值: 1000, 類(lèi)型: main.integer
1000
結(jié)構(gòu)體別名定義
package main
import "fmt"
//創(chuàng)建結(jié)構(gòu)體Student
type Student struct {
Number int
}
//結(jié)構(gòu)體定義別名
type Stu Student
func main() {
//聲明Student類(lèi)型結(jié)構(gòu)體
var a Student
a = Student{30}
//聲明Stu類(lèi)型結(jié)構(gòu)體
var b Stu
b = Stu{20}
//強(qiáng)轉(zhuǎn)類(lèi)型后才能進(jìn)行賦值
a = Student(b)
fmt.Printf("a = %d,類(lèi)型: %T\n", a, a)
b = Stu(a)
fmt.Printf("b = %d,類(lèi)型: %T\n", b, b)
}
輸出結(jié)果如下
a = {20},類(lèi)型: main.Student
b = {20},類(lèi)型: main.Stu
2. 工廠模式
Go 中所謂的工廠模式其實(shí)就是:
包內(nèi)一個(gè)不可直接實(shí)例的結(jié)構(gòu)體(結(jié)構(gòu)體名稱(chēng)首字母小寫(xiě)),包外不可直接實(shí)例,那么為了解決這個(gè)問(wèn)題,就寫(xiě)一個(gè)包外可調(diào)用的函數(shù),通過(guò)這個(gè)函數(shù)實(shí)現(xiàn)返回結(jié)構(gòu)體對(duì)象。
package main
import "fmt"
type Student struct {
Name string
Age int
}
func main() {
//初始化
stu1 := new(Student)
fmt.Println(stu1)
//工廠模式處理
stu2 := NewStudent("張三", 18)
fmt.Println(stu2)
}
//工廠模式
func NewStudent(name string, age int) *Student {
return &Student{
Name: name,
Age: age,
}
}
輸出結(jié)果如下
&{ 0}
&{張三 18}
總結(jié):① make 用來(lái)創(chuàng)建map、slice、channel
② new 用來(lái)創(chuàng)建值類(lèi)型
3. Tag 原信息
在和其他語(yǔ)言進(jìn)行對(duì)接交互時(shí)使用JSON格式,有些語(yǔ)言格式大小寫(xiě)規(guī)范比較嚴(yán)格,為了使Go語(yǔ)言和其他語(yǔ)言對(duì)接數(shù)據(jù)傳輸,所以使用Tag原信息進(jìn)行解決
通俗的來(lái)說(shuō)就相當(dāng)于是一個(gè)充電的轉(zhuǎn)接口
示例
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string
Age int
Score float32
}
func main() {
//初始化
var stu = new(Student)
stu.Name = "stu"
stu.Age = 20
stu.Score = 88
//使用Json處理結(jié)構(gòu)體,轉(zhuǎn)換成字節(jié)數(shù)組
data, err := json.Marshal(stu)
if err != nil {
fmt.Println("錯(cuò)誤提示:", err)
return
}
fmt.Println(data) //字節(jié)數(shù)組形式輸出
fmt.Println(string(data)) //轉(zhuǎn)換成字符串輸出
}輸出結(jié)果如下
[123 34 78 97 109 101 34 58 34 115 116 117 34 44 34 65 103 101 34 58 50 48 44 34 83 99 111 114 101 34 58 56 56 125]
{"Name":"stu","Age":20,"Score":88}
JSON格式化字段名
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
//json打包時(shí)字段名
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Score float32 `json:"stu_score"`
}
func main() {
//初始化
var stu = new(Student)
stu.Name = "stu"
stu.Age = 20
stu.Score = 88
//使用Json處理結(jié)構(gòu)體,轉(zhuǎn)換成字節(jié)數(shù)組
data, err := json.Marshal(stu)
if err != nil {
fmt.Println("錯(cuò)誤提示:", err)
return
}
fmt.Println(data)
fmt.Println(string(data))
}
輸出結(jié)果如下
[123 34 115 116 117 95 110 97 109 101 34 58 34 115 116 117 34 44 34 115 116 117 95 97 103 101 34 58 50 48 44 34 115 116 117 95 115 99 111 114 101 34 58 56 56 125]
{"stu_name":"stu","stu_age":20,"stu_score":88}
4. 匿名字段
結(jié)構(gòu)體中的字段(屬性)沒(méi)有名稱(chēng),稱(chēng)之為匿名字段
示例
package main
import "fmt"
type Cart struct {
name string
color string
}
type Train struct {
//匿名字段
Cart //實(shí)現(xiàn)繼承
int //數(shù)據(jù)類(lèi)型定義,僅能存在一次,兩個(gè)int則會(huì)沖突
}
func main() {
//初始化賦值
var t Train
t.name = "train"
t.color = "red"
t.int = 10 //直接調(diào)用數(shù)據(jù)類(lèi)型賦值
fmt.Println(t)
}輸出結(jié)果如下
{{train red} 10}
雙引用結(jié)構(gòu)體,多繼承(繼承的兩個(gè)結(jié)構(gòu)體中定義相同屬性)
package main
import "fmt"
//父結(jié)構(gòu)體
type Cart struct {
name string
color string
}
//父結(jié)構(gòu)體
type Box struct {
color string
}
//子結(jié)構(gòu)體
type Train struct {
//匿名字段
Cart //實(shí)現(xiàn)繼承
Box
int //數(shù)據(jù)類(lèi)型定義,僅能存在一次,兩個(gè)int則會(huì)沖突
}
func main() {
//初始化賦值
var t Train
t.name = "train"
t.Cart.color = "red"
t.Box.color = "blue"
t.int = 10 //直接調(diào)用數(shù)據(jù)類(lèi)型賦值
fmt.Println(t)
}輸出結(jié)果如下
{{train red} {blue} 10}
package main
import "fmt"
//父結(jié)構(gòu)體
type Cart struct {
name string
color string
}
//父結(jié)構(gòu)體
type Box struct {
color string
}
//子結(jié)構(gòu)體
type Train struct {
//匿名字段
Cart //實(shí)現(xiàn)繼承
Box
int //數(shù)據(jù)類(lèi)型定義,僅能存在一次,兩個(gè)int則會(huì)沖突
color string
}
func main() {
//初始化賦值
var t Train
t.name = "train"
t.Cart.color = "red" //Cart的屬性
t.Box.color = "blue" //Box的屬性
t.color = "yellow" //train自身屬性
t.int = 10 //直接調(diào)用數(shù)據(jù)類(lèi)型賦值
fmt.Println(t)
}5. 方法
- Go 中的方法是作用在特定類(lèi)型的變量上,因此自定義類(lèi)型,都可以有方法,而不僅僅是
struct - 語(yǔ)法格式如下
func (recevier type) methodName(參數(shù)列表)(返回值){}
???????recevier type 特定類(lèi)型,如指針、別名,結(jié)構(gòu)體
methodName 方法名示例
package main
import "fmt"
//定義結(jié)構(gòu)體
type Student struct {
Name string
Age int
}
//定義方法
func (s Student) init(name string, age int) Student {
s.Name = name
s.Age = age
return s
}
func main() {
var stu Student
s := stu.init("zhangsan", 18)
fmt.Printf("s: %v\n", s)
}輸出結(jié)果
s: {zhangsan 18}
定義返回方法是否會(huì)把初始化的值給返回?
package main
import "fmt"
//定義結(jié)構(gòu)體
type Student struct {
Name string
Age int
Score float32
}
//初始化方法
func (s *Student) init(name string, age int, score float32) {
s.Name = name
s.Age = age
s.Score = score
fmt.Println("初始化完成")
}
//返回結(jié)構(gòu)體
func (s *Student) get() Student {
return *s
}
func main() {
var stu Student
//定義值
stu.init("zhangsan", 18, 90)
//返回值
stu1 := stu.get()
fmt.Println(stu1)
}輸出結(jié)果如下
初始化完成
{zhangsan 18 90}
傳統(tǒng)數(shù)據(jù)類(lèi)型自定義方法,做數(shù)據(jù)類(lèi)型轉(zhuǎn)換
package main
import "fmt"
//別名類(lèi)型
type integer int
//傳統(tǒng)數(shù)據(jù)類(lèi)型自定義方法
func (p integer) convert() string {
return fmt.Sprintf("%d", p)
}
func main() {
var i integer
i = 100
s := i.convert()
fmt.Printf("類(lèi)型:%T,值:%s\n", s, s)
}輸出結(jié)果如下
類(lèi)型:string,值:100
指針傳入和值傳入的區(qū)別
值傳入不會(huì)對(duì)數(shù)值進(jìn)行改變,指針傳入才可以改變數(shù)值
package main
import "fmt"
type integer int
//傳統(tǒng)數(shù)據(jù)類(lèi)型自定義方法
func (p integer) convert() string {
return fmt.Sprintf("%d", p)
}
//方法傳指針進(jìn)行數(shù)據(jù)同步修改
func (p *integer) set(b integer) {
*p = b
}
func main() {
var i integer
i = 100
s := i.convert()
fmt.Printf("類(lèi)型: %T ,值: %s\n", s, s)
fmt.Printf("類(lèi)型: %T ,值: %d\n", i, i)
i.set(200)
fmt.Printf("i: %v\n", i)
}輸出結(jié)果如下
類(lèi)型: string ,值: 100
類(lèi)型: main.integer ,值: 100
i: 200
方法繼承,組合(匿名字段是組合的特殊形式)
package main
import "fmt"
//父結(jié)構(gòu)體
type Car struct {
weight int
name string
}
//父方法
func (c *Car) Run() {
fmt.Println("Running")
}
//子結(jié)構(gòu)體Bike
type Bike struct {
//組合(有名字)
c Car
wheel int
}
//子結(jié)構(gòu)體Train
type Train struct {
//匿名
Car
wheel int
}
func main() {
var bike Bike
bike.c.name = "bike"
bike.c.weight = 500
bike.wheel = 2
var train Train
train.name = "train"
train.weight = 140000
train.wheel = 8
fmt.Println(bike)
//方法繼承,調(diào)用父結(jié)構(gòu)體方法
bike.c.Run()
fmt.Println(train)
//方法繼承
train.Run()
}輸出結(jié)果如下
{{500 bike} 2}
Running
{{140000 train} 8}
Running
package main
import "fmt"
//父結(jié)構(gòu)體
type Cart struct {
weight int
Color string
}
//父方法
func (c Cart) Run() {
fmt.Println("Running")
}
//子結(jié)構(gòu)體train
type Train struct {
Cart
wheel int
}
//子結(jié)構(gòu)體方法
func (t Train) String() string {
str := fmt.Sprintf("color:[%s],weight:[%d],wheel:[%d]\n", t.Color, t.weight, t.wheel)
return str
}
func main() {
var train Train
train.Color = "red"
train.weight = 14000
train.wheel = 8
fmt.Println(train)
train.Run()
fmt.Printf("%s\n", train)
}輸出結(jié)果如下
color:[red],weight:[14000],wheel:[8]
???????
Running
color:[red],weight:[14000],wheel:[8]
到此這篇關(guān)于Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言結(jié)構(gòu)體 方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中switch語(yǔ)句和select語(yǔ)句的用法教程
這篇文章主要給大家介紹了關(guān)于Golang中switch和select的用法教程,文中通過(guò)示例代碼將switch語(yǔ)句與select語(yǔ)句的使用方法介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Golang map實(shí)踐及實(shí)現(xiàn)原理解析
這篇文章主要介紹了Golang map實(shí)踐以及實(shí)現(xiàn)原理,Go 語(yǔ)言中,通過(guò)哈希查找表實(shí)現(xiàn) map,用鏈表法解決哈希沖突,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06
Golang分布式應(yīng)用定時(shí)任務(wù)示例詳解
這篇文章主要為大家介紹了Golang分布式應(yīng)用定時(shí)任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Golang如何快速構(gòu)建一個(gè)CLI小工具詳解
這篇文章主要為大家介紹了Golang如何快速構(gòu)建一個(gè)CLI小工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Go語(yǔ)言Gin框架獲取請(qǐng)求參數(shù)的兩種方式
在添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫(xiě)業(yè)務(wù)處理代碼了,而編寫(xiě)業(yè)務(wù)代碼第一件事一般就是獲取HTTP請(qǐng)求的參數(shù)吧,Gin框架在net/http包的基礎(chǔ)上封裝了獲取參數(shù)的方式,本文小編給大家介紹了獲取參數(shù)的兩種方式,需要的朋友可以參考下2024-01-01
線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查
這篇文章主要介紹了線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

