GO浪---第1浪之结构体

Posted lcyw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO浪---第1浪之结构体相关的知识,希望对你有一定的参考价值。

一.结构体定义


使用struct关键字可以定义一个结构体, 结构体中的成员称为结构体的字段或属性。

type Person struct 
    age    int
    name, email string

上面的代码中,我们定义了一个包含3个字段的结构体, 相同类型的字段可以在同一行中定义,但推荐的做法是每一行只定义一个字段,如:

type Person struct 
	age    int
    name   string
    email  string

当然,结构体也可以不包含任何字段,称为空结构体,struct表示一个空的结构体,注意,直接定义一个空的结构体并没有意义。

二. 创建变量


上面介绍了如何定义结构体类型,接下来看看如何创建这个自定义类型的变量

1. 直接定义变量

 var m1 Member

这个使用方式并没有为字段赋初始值,所有字段均为空值,比如name的值为空字符串"",age的值为0。

2. 使用字面量创建变量

可以在大括号中为结构体的成员赋初始值,有两种赋初始值的方式:
一种是按字段在结构体中的顺序赋值,下面代码中m2就是使用这种方式,这种方式要求所有的字段都必须赋值,因此如果字段太多,每个字段都要赋值,会很繁琐,

另一种则使用字段名为指定字段赋值,如下面代码中变量m3的创建,使用这种方式,对于其他没有指定的字段,则使用该字段类型的零值作为初始化值。

  var m2 = Person 18,"小明","xiaoming@163.com"
  // 简短变量声明方式:m2 := Person 1,"小明","xiaoming@163.com",1,18

  var m3 = Person id:2,"name":"小红"
  // 简短变量声明方式:m3 := Person id:2,"name":"小红"

3. 访问字段


通过变量名,使用逗号(.),可以访问结构体类型中的字段,或为字段赋值,也可以对字段进行取址(&)操作。

fmt.Println(m2.name)//输出:小明

m3.name = "小花"
fmt.Println(m3.name)//输出:小花

age := &m3.age
*age = 20
fmt.Println(m3.age)//输出:20 

4.可见性


上面的例子中,我们定义结构体字段名(注意:是结构体字段名)首字母是小写的,这意味着这些字段在包外不可见,因而无法在其他包中被访问。

下面的例子中,我们将Person 声明在Person 包中,而后在main包中创建一个Person类型的变量,

package Person 
type Person struct 
	 age    int
    name   string
    email  string  


package main

fun main()
    var m = person.Person 18,"小明","xiaoming@163.com"//会引发panic错误


由于结构体的字段在包外不可见,因此,在main包中 无法为person的字段赋初始值,无论按字段还是按索引赋值,都会引发错误。
因此,如果想让定义的结构体的字段在其他包里可见,则结构体的字段名称首字母必须大写,如下:

type Member struct 
    Age    int
    Name   string
    Email  string  
 

5.Tags


在定义结构体字段时,除字段名称和数据类型外,还可以使用反引号为结构体字段声明元信息,这种元信息称为Tag,用于编译阶段关联到字段当中,如我们将上面例子中的结构体修改为:

type Person struct 
    Age    int    `json:"age"`
    Name   string `json:"name"`
    Email  string `json:"email"` 

这种添加tag的方式在解析json时经常会用到.

三. 结束

最后, 给出一个GO解析json文件的例子来结束这次GO浪之旅.

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)

// init is called prior to main.
func init() 
	log.SetOutput(os.Stdout)


//https://juejin.im/post/6844903814168838151
type Feed struct 
	Name string `json:"site"` // 声明对应的json key
	URI  string `json:"link"`
	Type string `json:"type"`


// 读取本地文件,解构json数据
func readFile(path string) ([]*Feed, error) 
	file, err := os.Open(path)
	if err != nil 
		return nil, err
	
	// 注意:打开文件之后,记得要关闭文件
	defer file.Close()

	// 注意:文件读取后,需要结构体来解析json数据
	var files []*Feed
	json.NewDecoder(file).Decode(&files)
	return files, nil

 

// main is the entry point for the program.
func main() 
	feeds, err := readFile("date.json")
	if err != nil 
		log.Fatal(err)
	
	for _, feed := range feeds 
		// Retrieve a matcher for the search.
		fmt.Printf("name: %s, url:%s\\n", feed.Name, feed.URI)
	



文件date.json内容如下:

[
	
		"site" : "npr",
		"link" : "http://www.npr.org/rss/rss.php?id=1001",
		"type" : "rss"
	,
	
		"site" : "npr",
		"link" : "http://www.npr.org/rss/rss.php?id=1008",
		"type" : "rss"
	,
	
		"site" : "npr",
		"link" : "http://www.npr.org/rss/rss.php?id=1006",
		"type" : "rss"
	,
	
		"site" : "nbcnews",
		"link" : "http://rss.msnbc.msn.com/id/28180066/device/rss/rss.xml",
		"type" : "rss"
	
]

参考: https://juejin.im/post/6844903814168838151

以上是关于GO浪---第1浪之结构体的主要内容,如果未能解决你的问题,请参考以下文章

go变量类的概念以及类的使用方式,嵌套结构体

go变量类的概念以及类的使用方式,嵌套结构体

go 复合类型: 数组slicemap结构体

Go语言基础:结构体

Go语言基础:结构体

GO语言--第6章 结构体