Structure des bases du langage Go (Hiver)
Héritage de structure
En parlant d'héritage, ceux qui ont étudié Java et Python doivent le connaître, mais cela n'existe pas dans Go.
Que devons-nous faire ???, nous devons encore utiliser une structure pour le mettre en œuvre.
Imaginez que nous sommes tous des garçons et que nous aimons les voitures, alors prenons les voitures comme exemple.
Structure de voiture
//车 type Car struct { Brand string //车品牌 CarNum string //车牌号 Tyre int //轮胎个数 } //给车绑定一个方法,说明车的基本信息 func (this *Car) carInfo() { fmt.Printf("品牌:%s,车牌号:%s,轮胎个数:%d\n", this.Brand, this.CarNum, this.Tyre) }
Voiture BMW
//宝马车 type BMWCar struct { //*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异 *Car //这就表示继承了Car这个结构体 }
Voiture BYD
//比亚迪车 type BYDCar struct { *Car }
Peut-être qu'après avoir vu ça, tu te sentiras familier. , n'est-ce pas l'imbrication de structures que nous avons utilisé dans la leçon précédente ? ? ?
Est-ce que cela a quelque chose à voir avec l'héritage ?
其实在Go中,结构体既可以用来存储数据,也可以用来模仿对象的各种操作。
main代码
func main() { //一个宝马对象 var bmw1 = BMWCar{&Car{ Brand: "宝马x8", CarNum: "京666", Tyre: 4, }} //一个比亚迪对象 var byd1 = BYDCar{&Car{ Brand: "比亚迪L3", CarNum: "京111", Tyre: 4, }} //因为 BMWCar 和 BYDCar 都继承了Car,所以都有carInfo这个方法 bmw1.carInfo() byd1.carInfo() }
执行结果
这就是一个最简单的,面向对象,跟其他语言一样,继承会将所有的属性和方法都继承过来。
序列化
到此为止呢,结构体基本可以告一段落了,基本算是入门了,当然,并没有结束,但是我想大家都累了,换个方向继续玩。
这个东西叫做序列化,什么意思呢,就是像咱们的切片了,map了,结构体了等,这些都是Go的类型。
如果要和其他语言交流,人家可没有这些玩意唉,那怎么办呢???
众多大佬就形成了一个规范,json
数据格式,json
数据必须是字符串类型。
最外面是'
号,键/值对组合中的键名写在前面并用双引号""
包裹。
就像这样。
'{"Gender":"男","Name":"张三"}' //'说明这个是字符串,一般打印时不显示
序列化我们用到的是json
模块的Marshal
方法。
切片序列化
单独的切片序列化用的很少,但是仍然还是要知道。
示例代码
package main import ( "encoding/json" "fmt" ) type Student struct { Gender string Name string } func main() { var StudentList = []string{"张三", "李四"} fmt.Printf("StudentList类型:%T\n", StudentList) //[]string,这是列表类型 serializeByte, err := json.Marshal(StudentList) if err != nil { fmt.Println("序列化失败") return } var serializeStr = string(serializeByte) fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 fmt.Printf("serializeStr值:%v\n", serializeStr) //["张三","李四"] }
第16行代码将切片序列化,但是返回的是[]byte
类型,第21行代码将[]byte
类型转成字符串。
执行结果
map序列化
字典序列化,就比较有味道了,序列化的是一个标准的json
数据格式。
示例代码
package main import ( "encoding/json" "fmt" ) type Student struct { Gender string Name string } func main() { var StudentInfo = map[string]string{ "Name":"张三", "Age":"18", "Gender":"男", } fmt.Printf("StudentInfo类型:%T\n",StudentInfo) serializeByte, err := json.Marshal(StudentInfo) if err != nil { fmt.Println("序列化失败") } var serializeStr = string(serializeByte) fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 fmt.Printf("serializeStr值:%v\n", serializeStr) //{"Age":"18","Gender":"男","Name":"张三"} }
执行结果
这个就有点像标准的json
格式了。
结构体序列化
结构体代码
type Student struct { Name string Gender string Age int }
main
func main() { var s1 = Student{ Name: "张三", Gender: "男", Age: 18, } fmt.Printf("StudentInfo类型:%T\n", s1) serializeByte, err := json.Marshal(s1) if err != nil { fmt.Println("序列化失败") } var serializeStr = string(serializeByte) fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 fmt.Printf("serializeStr值:%v\n", serializeStr) }
执行结果
切片套结构体
一般情况下,这种方式数据格式是用的比较多的。
当然, 还可以切片嵌套map,方法和此方法一样,不做例子了。
示例代码
package main import ( "encoding/json" "fmt" ) type Student struct { Name string Gender string Age int } func main() { var s1 = Student{ Name: "张三", Gender: "男", Age: 18, } var s2 = Student{ Name: "李四", Gender: "女", Age: 16, } //一个存放 Student 的列表 var studentList = []Student{s1, s2} fmt.Printf("StudentInfo类型:%T\n", studentList) serializeByte, err := json.Marshal(studentList) //main.Student if err != nil { fmt.Println("序列化失败") } var serializeStr = string(serializeByte) fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 fmt.Printf("serializeStr值:%v\n", serializeStr) }
执行结果
结构体标签(Tag)
Tag
可以理解为结构体的说明,由一对反引号包裹起来。
但是一般情况下,Tag在序列化是用的比较多。
结构体代码
type Student struct { Name string `json:"name"` Gender string `json:"gender"` Age int `json:"age"` }
每个字段后面跟的,就是Tag,一定不要把格式搞错啦。
main代码
func main() { var s1 = Student{ Name: "张三", Gender: "男", Age: 18, } fmt.Printf("StudentInfo类型:%T\n", s1) serializeByte, err := json.Marshal(s1) //main.Student if err != nil { fmt.Println("序列化失败") } var serializeStr = string(serializeByte) fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 fmt.Printf("serializeStr值:%v\n", serializeStr) }
执行结果
可以发现key成小写的了,这就说明一个问题。
Pendant la sérialisation, si la structure a json
json
这个Tag,序列化时就会以json
Tag为准,如果没有json
Cette balise sera sérialisée avec json
La balise prévaudra, s'il n'y a pas de json
Tag, alors le
champ de structure prévaudra
Résumé Ci-dessus, nous avons appris l' héritage de structure , sérialisation des structures de base de Go ,
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Lorsque vous utilisez SQL.Open, pourquoi le DSN ne signale-t-il pas une erreur? En langue go, sql.open ...
