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

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() {
	//類型別名定義
	var i integer = 1000
	fmt.Printf("值: %d, 類型: %T\n", i, i)

	var j int = 100
	j = int(i) 			//j和i不屬于同一類型,需要轉(zhuǎn)換
	fmt.Println(j)
}

輸出結(jié)果如下

值: 1000, 類型: 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類型結(jié)構(gòu)體
	var a Student
	a = Student{30}

	//聲明Stu類型結(jié)構(gòu)體
	var b Stu
	b = Stu{20}

	//強(qiáng)轉(zhuǎn)類型后才能進(jìn)行賦值
	a = Student(b)
	fmt.Printf("a = %d,類型: %T\n", a, a)
	b = Stu(a)
	fmt.Printf("b = %d,類型: %T\n", b, b)
}

輸出結(jié)果如下

a = {20},類型: main.Student
b = {20},類型: main.Stu

2. 工廠模式

Go 中所謂的工廠模式其實(shí)就是:

包內(nèi)一個(gè)不可直接實(shí)例的結(jié)構(gòu)體(結(jié)構(gòu)體名稱首字母小寫),包外不可直接實(shí)例,那么為了解決這個(gè)問(wèn)題,就寫一個(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)建值類型

3. Tag 原信息

在和其他語(yǔ)言進(jìn)行對(duì)接交互時(shí)使用JSON格式,有些語(yǔ)言格式大小寫規(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)有名稱,稱之為匿名字段

示例

package main

import "fmt"

type Cart struct {
	name  string
	color string
}

type Train struct {
	//匿名字段
	Cart //實(shí)現(xiàn)繼承
	int  //數(shù)據(jù)類型定義,僅能存在一次,兩個(gè)int則會(huì)沖突
}

func main() {
	//初始化賦值
	var t Train		
	t.name = "train"
	t.color = "red"
	t.int = 10		//直接調(diào)用數(shù)據(jù)類型賦值
	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ù)類型定義,僅能存在一次,兩個(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ù)類型賦值
	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ù)類型定義,僅能存在一次,兩個(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ù)類型賦值
	fmt.Println(t)
}

5. 方法

  • Go 中的方法是作用在特定類型的變量上,因此自定義類型,都可以有方法,而不僅僅是 struct
  • 語(yǔ)法格式如下
func (recevier type) methodName(參數(shù)列表)(返回值){}

???????recevier type     特定類型,如指針、別名,結(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ù)類型自定義方法,做數(shù)據(jù)類型轉(zhuǎn)換

package main

import "fmt"

//別名類型
type integer int

//傳統(tǒng)數(shù)據(jù)類型自定義方法
func (p integer) convert() string {
	return fmt.Sprintf("%d", p)
}

func main() {
	var i integer
	i = 100
	s := i.convert()
	fmt.Printf("類型:%T,值:%s\n", s, s)
}

輸出結(jié)果如下

類型:string,值:100

指針傳入和值傳入的區(qū)別

值傳入不會(huì)對(duì)數(shù)值進(jìn)行改變,指針傳入才可以改變數(shù)值

package main

import "fmt"

type integer int

//傳統(tǒng)數(shù)據(jù)類型自定義方法
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("類型: %T ,值: %s\n", s, s)
	fmt.Printf("類型: %T ,值: %d\n", i, i)
	i.set(200)
	fmt.Printf("i: %v\n", i)
}

輸出結(jié)果如下

類型: string ,值: 100
類型: 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簡(jiǎn)單位運(yùn)算示例

    golang簡(jiǎn)單位運(yùn)算示例

    這篇文章主要介紹了golang簡(jiǎn)單位運(yùn)算,包括位移運(yùn)算、取反及位與位或等運(yùn)算,需要的朋友可以參考下
    2016-07-07
  • 一文了解Go語(yǔ)言的并發(fā)特性

    一文了解Go語(yǔ)言的并發(fā)特性

    本文主要介紹了一文了解Go語(yǔ)言的并發(fā)特性,通過(guò)輕量級(jí)線程、通道及選擇語(yǔ)句,使得并發(fā)編程變得既簡(jiǎn)單又高效,下面就來(lái)具體了解一下如何使用,感興趣的可以了解一下
    2024-02-02
  • Go語(yǔ)言簡(jiǎn)介和環(huán)境配置

    Go語(yǔ)言簡(jiǎn)介和環(huán)境配置

    Go語(yǔ)言保證了既能到達(dá)靜態(tài)編譯語(yǔ)言的安全和性能,又達(dá)到了動(dòng)態(tài)語(yǔ)言開發(fā)速度和易維護(hù)性,有人形容Go語(yǔ)言:Go=?C?+?Python?,?說(shuō)明Go語(yǔ)言既有C靜態(tài)語(yǔ)言程序的運(yùn)行速度,又能達(dá)到Python動(dòng)態(tài)語(yǔ)言的快速開發(fā),這篇文章主要介紹了Go介紹和環(huán)境配置,需要的朋友可以參考下
    2022-07-07
  • Go項(xiàng)目與Docker結(jié)合實(shí)現(xiàn)高效部署深入探究

    Go項(xiàng)目與Docker結(jié)合實(shí)現(xiàn)高效部署深入探究

    在現(xiàn)代軟件開發(fā)中,使用Docker部署應(yīng)用程序已經(jīng)成為一種標(biāo)準(zhǔn)實(shí)踐,本文將深入探討如何將Go項(xiàng)目與Docker結(jié)合,實(shí)現(xiàn)高效、可靠的部署過(guò)程,通過(guò)詳細(xì)的步驟和豐富的示例,你將能夠迅速掌握這一流程
    2023-12-12
  • golang并發(fā)工具M(jìn)apReduce降低服務(wù)響應(yīng)時(shí)間

    golang并發(fā)工具M(jìn)apReduce降低服務(wù)響應(yīng)時(shí)間

    這篇文章主要為大家介紹了golang并發(fā)使用MapReduce降低服務(wù)響應(yīng)時(shí)間實(shí)踐使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • GoLang并發(fā)機(jī)制探究goroutine原理詳細(xì)講解

    GoLang并發(fā)機(jī)制探究goroutine原理詳細(xì)講解

    goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò) go 關(guān)鍵字來(lái)開啟 goroutine 即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下
    2022-12-12
  • golang flag包的使用教程

    golang flag包的使用教程

    golang 的 flag 包是用于處理命令行參數(shù)的工具包,我們可以基于這個(gè)包來(lái)開發(fā)自定義的命令行工具,下面小編就來(lái)為大家介紹一下flag包的具體使用吧
    2023-09-09
  • go語(yǔ)言實(shí)現(xiàn)抓取高清圖片

    go語(yǔ)言實(shí)現(xiàn)抓取高清圖片

    本文給大家分享的是使用go語(yǔ)言實(shí)現(xiàn)的抓取高清美女圖片的代碼,原理非常簡(jiǎn)單,這里就不多廢話了,主要是看到很多小伙伴使用python實(shí)現(xiàn)的,心血來(lái)潮就用go寫了下,推薦給大家。
    2015-03-03
  • Go學(xué)習(xí)筆記之Zap日志的使用

    Go學(xué)習(xí)筆記之Zap日志的使用

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中Zap日志的使用以及安裝,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2022-07-07
  • Go語(yǔ)言開發(fā)必知的一個(gè)內(nèi)存模型細(xì)節(jié)

    Go語(yǔ)言開發(fā)必知的一個(gè)內(nèi)存模型細(xì)節(jié)

    這篇文章主要為大家介紹了Go語(yǔ)言開發(fā)必知的一個(gè)內(nèi)存模型細(xì)節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論