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浪之结构体的主要内容,如果未能解决你的问题,请参考以下文章