前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Struct 声明和使用

Golang Struct 声明和使用

作者头像
程序员同行者
发布2019-01-03 10:55:43
5500
发布2019-01-03 10:55:43
举报
文章被收录于专栏:程序员同行者程序员同行者
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
-------------------
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Golang Struct 声明和使用
    • Struct 声明
      • struct 实例化的方法
        • struct 练习
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档