专栏首页程序员同行者Golang Struct 声明和使用

Golang Struct 声明和使用

Golang Struct 声明和使用

Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型

Struct 声明

具体的语法

type identifier struct{
    field1 data_type
    field2 data_type
    field3 data_type
}

例子

package main

import (
    "fmt"
)

type rectangle struct {
    length  float64
    breadth float64
    color   string
}

func main() {
    fmt.Println(rectangle{10.4, 25.10, "red"})
}
struct 实例化的方法
  1. 点运算符 可以使用点运算符访问结构体中的数据值
type rectangle struct {
    length  int
    breadth int
    color   string

    geometry struct {
        area      int
        perimeter int
    }
}

func main() {
    var rec rectangle
    rec.breadth = 19
    rec.length = 23
    rec.color = "Green"

    rec.geometry.area = rec.length * rec.breadth
    rec.geometry.perimeter = 2 * (rec.length + rec.breadth)
    fmt.Println(rec)
    fmt.Println("Area:\t", rec.geometry.area)
    fmt.Println("Perimeter:", rec.geometry.perimeter)
}
  1. 使用 var关键词和 :=运算符 如果初始化时,指定了特定的名称,那么有些字段是可以省略的
type rectangle struct {
    length  int
    breadth int
    color   string
}

func main() {
    var rect1 = rectangle{10, 20, "Red"}
    fmt.Println(rect1)

    var rect2 = rectangle{length: 10, color: "Red"}
    fmt.Println(rect2)

    rect3 := rectangle{10, 20, "Green"}
    fmt.Println(rect3)

    rect4 := rectangle{length: 10, breadth: 20, color: "Green"}
    fmt.Println(rect4)

    rect5 := rectangle{breadth: 20, color: "Green"}
    fmt.Println(rect5)
}
  1. 使用 new 关键字
type rectangle struct {
    length  int
    breadth int
    color   string
}

func main() {
    rect1 := new(rectangle)
    rect1.length = 10
    rect1.breadth = 20
    rect1.color = "Green"
    fmt.Println(rect1)

    rect2 := new(rectangle)
    rect2.breadth = 20
    rect2.color = "Red"
    fmt.Println(rect2)
}
  1. 使用 & 运算符
type rectangle struct {
    length  int
    breadth int
    color   string
}

func main() {
    var rect1 = &rectangle{10, 20, "Red"} //此时不能省略任何值
    fmt.Println(rect1)

    var rect2 = &rectangle{}
    rect2.length = 10
    rect2.color = "Red"
    fmt.Println(rect2)

    var rect3 = &rectangle{}
    (*rect3).breadth = 20
    (*rect3).color = "Blue"
    fmt.Println(rect3)
}
struct 练习
  1. struct中的tag标签
type Employee struct {
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    City      string `json:"city"`
}

func main() {
    json_str := `
    {
        "firstname":"Kevin",
        "lastname":"Woo",
        "city":"Beijing"
    }`

    emp1 := new(Employee)
    err := json.Unmarshal([]byte(json_str), emp1)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(emp1)

    emp2 := new(Employee)
    emp2.FirstName = "John"
    emp2.LastName = "Lee"
    emp2.City = "Shanghai"
    jsonStr, _ := json.Marshal(emp2)
    fmt.Printf("%s", jsonStr)
}

输出结果

&{Kevin Woo Beijing}
{"firstname":"John","lastname":"Lee","city":"Shanghai"}
  1. 内嵌的struct 类型
func main() {
    type Salary struct {
        Basic, HRA, TA float64
    }
    type Employee struct {
        FirstName, LastName, Email string
        Age                        int
        MonthlySalary              []Salary
    }

    e := Employee{
        FirstName: "Kevin",
        LastName:  "Woo",
        Email:     "test@mail.com",
        Age:       12,
        MonthlySalary: []Salary{
            Salary{
                Basic: 15000.00,
                HRA:   5000.0,
                TA:    2000.0,
            },
            Salary{
                Basic: 16000.0,
                HRA:   6000.0,
                TA:    2100.0,
            },
        },
    }

    fmt.Println(e.FirstName,e.LastName)
    fmt.Println(e.Age)
    fmt.Println(e.Email)
    fmt.Println(e.MonthlySalary[0])
    fmt.Println(e.MonthlySalary[1])
}

输出结果

Kevin Woo
12
test@mail.com
{15000 5000 2000}
{16000 6000 2100}
  1. struct 添加方法
type Salary struct {
    Basic, HRA, TA float64
}
type Employee struct {
    FirstName, LastName, Email string
    Age                        int
    MonthlySalary              []Salary
}

func (e Employee) EmpInfo() string {
    fmt.Println(e.FirstName, e.LastName)
    fmt.Println(e.Age)
    fmt.Println(e.Email)
    for _, info := range e.MonthlySalary {
        fmt.Println("=================")
        fmt.Println(info.Basic)
        fmt.Println(info.HRA)
        fmt.Println(info.TA)
    }
    return "-------------------"
}

func main() {

    e := Employee{
        FirstName: "Kevin",
        LastName:  "Woo",
        Email:     "test@mail.com",
        Age:       12,
        MonthlySalary: []Salary{
            Salary{
                Basic: 15000.00,
                HRA:   5000.0,
                TA:    2000.0,
            },
            Salary{
                Basic: 16000.0,
                HRA:   6000.0,
                TA:    2100.0,
            },
        },
    }

    fmt.Println(e.EmpInfo())
}

输出结果

Kevin Woo
12
test@mail.com
=================
15000
5000
2000
=================
16000
6000
2100
-------------------

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • centos 6.x安装rvm 配置 Ruby开发环境

    程序员同行者
  • confluence wiki搭建使用

    1)软件包,地址下载 http://pan.baidu.com/s/1ntlBCQP  ,把几个 软件包放在服务器上

    程序员同行者
  • MYSQL介绍安装及一些问题解决

    程序员同行者
  • 009. golang 函数 function

    qubianzhong
  • Unity2D手册翻译(二)

    Sprite Creator 通过这个工具,你可以建立一个临时的 Sprite(2D)图形占位器。 你可以在你的项目中的开发期使用这些占位器,然后用你想要用的图...

    韩伟
  • Hello Flutter,船长初体验

    前几天 Google 发布了 flutter.cn 以及 release 了 Flutter 1.9 ,今天船长没忍住,尝试了下 Flutter。

    程序亦非猿
  • 《快学 Go 语言》第 6 课 —— 字典

    字典在数学上的词汇是映射,将一个集合中的所有元素关联到另一个集合中的部分或全部元素,并且只能是一一映射或者多对一映射。

    老钱
  • 《快学 Go 语言》第 2 课 —— 变量什么的最讨厌了

    任何一门语言里面最基础的莫过于变量了。如果把内存比喻成一格一格整齐排列的储物箱,那么变量就是每个储物箱的标识,我们通过变量来访问计算机内存。没有变量的程序对于人...

    老钱
  • 快学 Go 语言第 2 课 —— 变量什么的最讨厌了

    任何一门语言里面最基础的莫过于变量了。如果把内存比喻成一格一格整齐排列的储物箱,那么变量就是每个储物箱的标识,我们通过变量来访问计算机内存。没有变量的程序对于人...

    老钱
  • Golang学习笔记 控制流

    条件语句 if语句 下面是Golang的if语句,需要注意的是条件判断块不需要小括号,而且if语句的大括号不能省略,即使其中只有一行语句。 if conditi...

    乐百川

扫码关注云+社区

领取腾讯云代金券