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

Go語言學習之結構體和方法使用詳解

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

1. 結構體別名定義

變量別名定義

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不屬于同一類型,需要轉換
	fmt.Println(j)
}

輸出結果如下

值: 1000, 類型: main.integer
1000

結構體別名定義

package main

import "fmt"

//創(chuàng)建結構體Student
type Student struct {
	Number int
}

//結構體定義別名
type Stu Student

func main() {
	//聲明Student類型結構體
	var a Student
	a = Student{30}

	//聲明Stu類型結構體
	var b Stu
	b = Stu{20}

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

輸出結果如下

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

2. 工廠模式

Go 中所謂的工廠模式其實就是:

包內一個不可直接實例的結構體(結構體名稱首字母小寫),包外不可直接實例,那么為了解決這個問題,就寫一個包外可調用的函數(shù),通過這個函數(shù)實現(xiàn)返回結構體對象。

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,
	}
}

輸出結果如下

&{ 0}
&{張三 18}

總結:① make 用來創(chuàng)建mapslice、channel

② new 用來創(chuàng)建值類型

3. Tag 原信息

在和其他語言進行對接交互時使用JSON格式,有些語言格式大小寫規(guī)范比較嚴格,為了使Go語言和其他語言對接數(shù)據(jù)傳輸,所以使用Tag原信息進行解決

通俗的來說就相當于是一個充電的轉接口

示例

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é)數(shù)組
	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("錯誤提示:", err)
		return
	}
	fmt.Println(data)				//字節(jié)數(shù)組形式輸出
	fmt.Println(string(data))		//轉換成字符串輸出
}

輸出結果如下

[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打包時字段名
	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é)數(shù)組
	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("錯誤提示:", err)
		return
	}
	fmt.Println(data)
	fmt.Println(string(data))
}

輸出結果如下

[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. 匿名字段

結構體中的字段(屬性)沒有名稱,稱之為匿名字段

示例

package main

import "fmt"

type Cart struct {
	name  string
	color string
}

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

func main() {
	//初始化賦值
	var t Train		
	t.name = "train"
	t.color = "red"
	t.int = 10		//直接調用數(shù)據(jù)類型賦值
	fmt.Println(t)
}

輸出結果如下

{{train red} 10}

雙引用結構體,多繼承(繼承的兩個結構體中定義相同屬性)

package main

import "fmt"

//父結構體
type Cart struct {
	name  string
	color string
}

//父結構體
type Box struct {
	color string
}

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

func main() {
	//初始化賦值
	var t Train
	t.name = "train"
	t.Cart.color = "red"
	t.Box.color = "blue"
	t.int = 10 //直接調用數(shù)據(jù)類型賦值
	fmt.Println(t)
}

輸出結果如下

{{train red} {blue} 10}

package main

import "fmt"

//父結構體
type Cart struct {
	name  string
	color string
}

//父結構體
type Box struct {
	color string
}

//子結構體
type Train struct {
	//匿名字段
	Cart //實現(xiàn)繼承
	Box
	int   //數(shù)據(jù)類型定義,僅能存在一次,兩個int則會沖突
	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           //直接調用數(shù)據(jù)類型賦值
	fmt.Println(t)
}

5. 方法

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

???????recevier type     特定類型,如指針、別名,結構體 
methodName           方法名

示例

package main

import "fmt"

//定義結構體
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)
}

輸出結果

s: {zhangsan 18}

定義返回方法是否會把初始化的值給返回?

package main

import "fmt"

//定義結構體
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("初始化完成")
}

//返回結構體
func (s *Student) get() Student {
	return *s
}

func main() {
	var stu Student
	//定義值
	stu.init("zhangsan", 18, 90)
	//返回值
	stu1 := stu.get()
	fmt.Println(stu1)
}

輸出結果如下

初始化完成
{zhangsan 18 90}

傳統(tǒng)數(shù)據(jù)類型自定義方法,做數(shù)據(jù)類型轉換

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)
}

輸出結果如下

類型:string,值:100

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

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

package main

import "fmt"

type integer int

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

//方法傳指針進行數(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)
}

輸出結果如下

類型: string ,值: 100
類型: main.integer ,值: 100
i: 200

方法繼承,組合(匿名字段是組合的特殊形式)

package main

import "fmt"

//父結構體
type Car struct {
	weight int
	name   string
}

//父方法
func (c *Car) Run() {
	fmt.Println("Running")
}

//子結構體Bike
type Bike struct {
	//組合(有名字)
	c     Car
	wheel int
}

//子結構體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)
	//方法繼承,調用父結構體方法
	bike.c.Run()

	fmt.Println(train)
	//方法繼承
	train.Run()
}

輸出結果如下

{{500 bike} 2}
Running
{{140000 train} 8}
Running

package main

import "fmt"

//父結構體
type Cart struct {
	weight int
	Color  string
}

//父方法
func (c Cart) Run() {
	fmt.Println("Running")
}

//子結構體train
type Train struct {
	Cart
	wheel int
}

//子結構體方法
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)
}

輸出結果如下

color:[red],weight:[14000],wheel:[8]
???????
Running
color:[red],weight:[14000],wheel:[8]

到此這篇關于Go語言學習之結構體和方法使用詳解的文章就介紹到這了,更多相關Go語言結構體 方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言?nil使用避坑指南

    go語言?nil使用避坑指南

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

    Golang中switch語句和select語句的用法教程

    這篇文章主要給大家介紹了關于Golang中switch和select的用法教程,文中通過示例代碼將switch語句與select語句的使用方法介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • Golang map實踐及實現(xiàn)原理解析

    Golang map實踐及實現(xiàn)原理解析

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

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

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

    Golang分布式應用定時任務示例詳解

    這篇文章主要為大家介紹了Golang分布式應用定時任務示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Golang如何快速構建一個CLI小工具詳解

    Golang如何快速構建一個CLI小工具詳解

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

    Go操作redis與redigo的示例解析

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

    Go語言Gin框架獲取請求參數(shù)的兩種方式

    在添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫業(yè)務處理代碼了,而編寫業(yè)務代碼第一件事一般就是獲取HTTP請求的參數(shù)吧,Gin框架在net/http包的基礎上封裝了獲取參數(shù)的方式,本文小編給大家介紹了獲取參數(shù)的兩種方式,需要的朋友可以參考下
    2024-01-01
  • 線上golang grpc服務資源泄露問題排查

    線上golang grpc服務資源泄露問題排查

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

    Golang Defer基礎操作詳解

    在golang當中,defer代碼塊會在函數(shù)調用鏈表中增加一個函數(shù)調用。這個函數(shù)調用不是普通的函數(shù)調用,而是會在函數(shù)正常返回,也就是return之后添加一個函數(shù)調用。因此,defer通常用來釋放函數(shù)內部變量
    2022-10-10

最新評論

绩溪县| 维西| 大足县| 灵武市| 广灵县| 肇州县| 社旗县| 安徽省| 正镶白旗| 绥江县| 峨山| 福泉市| 临夏县| 沙湾县| 平乡县| 响水县| 柞水县| 百色市| 洪江市| 时尚| 龙州县| 靖江市| 宕昌县| 石狮市| 石台县| 龙门县| 上犹县| 定州市| 高唐县| 敦化市| 旬阳县| 广昌县| 德庆县| 延吉市| 吉木萨尔县| 乌兰浩特市| 合山市| 德令哈市| 洪洞县| 江陵县| 聂荣县|