当我们要表示同一种数据类型时候,可以用到数组,切片和字典。 当我们要表示不同的数据类型呢?这时候就要用到结构体了

一:定义struct

关键字 type 和 struct 来定义结构体

type student struct {
name string
age int
}

二:struct赋值

var stu student
stu.name = "Tom"
stu.age =
fmt.Printf("name %s, age: %d", stu.name, stu.age)

除了上面,还有下面几种方式:

1.提供顺序初始化
stu := person{"Tom", 20}
2.通过field:value的方式初始化,可以是任意顺序
stu := person{"age":20, "name":"Tom"}
3:也可以通过new分配指针
stu := new(person)

完整例子:

package main

import "fmt"

type person struct {
name string
age int
} func main() {
var stu person
//赋值初始化
stu.name, stu.age = "Tom", //根据field:value初始化
jimmy := person{age: , name: "jimmy"} //按照顺序初始化
mike := person{"mike", } fmt.Println(stu.name, jimmy.name, mike.name, jimmy.age, mike.age)
}

三:结构体传递参数

package main

import "fmt"

//结构体传递参数
type Rect struct {
with, length float64
} func double_area(rect Rect) float64 {
rect.with *=
rect.length *=
return rect.with * rect.length
} func main() {
var rect = Rect{, }
area := double_area(rect)
fmt.Println(area)
}

四:结构体函数

上面我们在main函数计算了双倍矩形面积,但是double_area不能作为 Rect 的方法实现,而是将Rect对象作为参数传给了函数计算,还有没有其他方法实现呢,当然有

package main

import "fmt"

type Rect struct {
with, length float64
} func (r Rect) double_area() float64 {
r.with *=
r.length *=
return r.with * r.length
} func main() {
var rect = Rect{, }
fmt.Println(rect.double_area())
}

五:  结构体内嵌类型

我们可以在一个结构体内部定义一个结构体类型的成员

package main

import "fmt"

type Phone struct {
price int
color string
} type IPhone struct {
phone Phone
model string
} func main() {
var p IPhone
p.phone.price =
p.phone.color = "red"
p.model = "ipone 6s"
fmt.Println("Price:", p.phone.price)
fmt.Println("Color:", p.phone.color)
fmt.Println("Model:", p.model)
}

六:struct匿名字段

上面我们定义了一个嵌套结构体, 实际上go也提供一种不写名字嵌套的结构体,也就是匿名字段

package main

import "fmt"

type Phone struct {
price int
color string
} type IPhone struct {
Phone //匿名字段,那么默认IPhone就包含了Phone所有字段
model string
} func main() {
var p IPhone
p.Phone.price = //直接 p.Phone.price 赋值
p.Phone.color = "glod"
p.model = "ipone 7p"
fmt.Println("Price:", p.Phone.price)
fmt.Println("Color:", p.Phone.color)
fmt.Println("Model:", p.model)
}

Golang基础(4):Go结构体的更多相关文章

  1. Golang通过反射获取结构体的标签

    Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...

  2. 换个语言学一下 Golang (9)——结构体和接口

    基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...

  3. golang 使用reflect反射结构体

    "反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过refl ...

  4. Go语言基础六:结构体和方法

    结构体 结构体是一个由用户定义的复合类型,它由一系列属性组成,每个属性都有自己的类型和值.Go语言中数组可以存储同一类型的数据,但在结构体中用户可以为不同项定义不同(或相同)的数据类型.结构体是值类型 ...

  5. 黑马程序员——C语言基础 变量类型 结构体

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)变量类型 1)局部变量 1> 定义:在函数内部定义的变量,称为 ...

  6. 12、C#基础整理(结构体)

    结构体 1.概念: 结构体是写在main函数外的数据结构,由不同类型的数据组合成一个整体,这些组合在一个整体中的数据是互相联系的 2.声明方式: struct 结构体名 { 成员变量(由类型名+成员名 ...

  7. Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)

    program WriteStruct; {$APPTYPE CONSOLE} uses SysUtils; //写入结构体 type TCustomer = record ID: ]; Code: ...

  8. golang 兼容不同json结构体解析实践

    线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单 ...

  9. 张超超OC基础回顾03_结构体类型作为成员变量的特殊用法

    直接上例子: 要求: 合理的设计一个”学生“类 学生有* 姓名* 生日两个属性和说出自己姓名生日方法  要求利用设计的学生类创建学生对象,并说出自己的姓名和年龄 描述学生类 事物名称: 学生(Stud ...

  10. C# 基础之类与结构体的区别

    1.语法上的区别是: 定义类使用关键字class,定义结构体用关键字struct 2.结构体中不可对声明字段进行初始化,但类可以 3. 类:如果没有为类显示的定义一个构造函数,c#编译器会自动生成一个 ...

随机推荐

  1. 脚本_通过进程与端口判断myslq服务

    #!bin/bashif [[ $port -eq 1 || $porcess -eq 2 ]];then  #通过条件判断端口和进程执行的返回值.     echo "mysql is s ...

  2. linux之crontab定时器

    一.安装crontab yum -y install vixie-cron yum -y install crontabs 说明:vixie-cron 软件包是 cron 的主程序:crontabs ...

  3. python路径拼接os.path.join()函数的用法

    os.path.join()函数:连接两个或更多的路径名组件 1.如果各组件名首字母不包含’/’,则函数会自动加上 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃 3.如果最后一个组 ...

  4. python主流框架简介和Django框架的使用

    目录 一.手撸简易web框架 二.动静态网页 1. 静态网页 2. 动态网页 三.jinja2模板语法 1. jinja2的作用 四.python主流web框架 1. django 3. tornad ...

  5. iOS 自定义NavigationBar右侧按钮rightBarButtonItem

    自定义右侧的一个按钮 UIBarButtonItem *myButton = [[UIBarButtonItem alloc] initWithTitle:@"主页" style: ...

  6. JAVA笔记24-IO流(2)-节点流举例

    节点流类型 例1: import java.io.*; public class TestFileInputStream{ public static void main(String args[]) ...

  7. electron-vue 更新 使用electron-update的版本

    electron-vue使用的electron版本比较老,用最新的electron-update会报错 我用这个版本成功 "electron-updater": "^3. ...

  8. python深度学习:矩阵转置(transpose)

    转置:即行列转换. import numpy as np import matplotlib.pyplot as plt C=np.array([[1,2,3],[4,5,6]]) # Display ...

  9. CF718C Sasha and Array 线段树 + 矩阵乘法

    有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$   直接求不好求,改成矩阵乘法的形式:  $a_{i}=M^x\times ...

  10. docker-compose进行部署容器的时候,报错权限不足

    刚刚用docker-compose部署elk的时候,没有起来,查看日志的时候,发现在数据卷挂载的时候,报错权限不足. 由于日志不在了,这里就直接贴出解决办法. 问题原因及解决办法 原因是CentOS7 ...