最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解

 更新時(shí)間:2022年04月21日 08:18:06   作者:隱姓埋名4869  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體和方法的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下

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)建mapslice、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)文章

  • go語(yǔ)言?nil使用避坑指南

    go語(yǔ)言?nil使用避坑指南

    這篇文章主要為大家介紹了go語(yǔ)言?nil使用避坑指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Golang中switch語(yǔ)句和select語(yǔ)句的用法教程

    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)原理解析

    這篇文章主要介紹了Golang map實(shí)踐以及實(shí)現(xiàn)原理,Go 語(yǔ)言中,通過(guò)哈希查找表實(shí)現(xiàn) map,用鏈表法解決哈希沖突,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • 一文了解Go語(yǔ)言中編碼規(guī)范的使用

    一文了解Go語(yǔ)言中編碼規(guī)范的使用

    這篇文章主要介紹了一文了解Go語(yǔ)言中編碼規(guī)范的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Golang分布式應(yīng)用定時(shí)任務(wù)示例詳解

    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小工具詳解

    這篇文章主要為大家介紹了Golang如何快速構(gòu)建一個(gè)CLI小工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go操作redis與redigo的示例解析

    Go操作redis與redigo的示例解析

    這篇文章主要為大家介紹了Go操作redis與redigo的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語(yǔ)言Gin框架獲取請(qǐng)求參數(shù)的兩種方式

    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)題排查

    這篇文章主要介紹了線(xiàn)上golang grpc服務(wù)資源泄露問(wèn)題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Golang Defer基礎(chǔ)操作詳解

    Golang Defer基礎(chǔ)操作詳解

    在golang當(dāng)中,defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用。這個(gè)函數(shù)調(diào)用不是普通的函數(shù)調(diào)用,而是會(huì)在函數(shù)正常返回,也就是return之后添加一個(gè)函數(shù)調(diào)用。因此,defer通常用來(lái)釋放函數(shù)內(nèi)部變量
    2022-10-10

最新評(píng)論

恩施市| 奉新县| 南通市| 盘山县| 巢湖市| 长白| 同德县| 辛集市| 屏山县| 巴南区| 桐城市| 九寨沟县| 独山县| 宁明县| 宜丰县| 景泰县| 阳曲县| 泽州县| 阿克陶县| 泰和县| 洛隆县| 阿巴嘎旗| 富源县| 永寿县| 中方县| 潼南县| 旌德县| 江西省| 利川市| 浪卡子县| 龙川县| 安西县| 仁布县| 天镇县| 交口县| 大竹县| 普宁市| 龙江县| 如皋市| 临泉县| 汉中市|