结构体定义的一般方式如下:

type identifier struct {
field1 type1
field2 type2
...
}

type T struct {a, b int} 也是合法的语法,它更适用于简单的结构体。

var t *T
t = new(T)

变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值,使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针。

无论变量是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段,即:

type myStruct struct { i int }
var v myStruct // v是结构体类型变量
var p *myStruct // p是指向一个结构体类型变量的指针
v.i
p.i

struct实例:

package main

import (
"fmt"
"strings"
) type Person struct {
firstName string
lastName string
} func upPerson(p *Person) {
p.firstName = strings.ToUpper(p.firstName)
p.lastName = strings.ToUpper(p.lastName)
} func main() { // 1-struct as a value type:
var pers1 Person
pers1.firstName = "Chris"
pers1.lastName = "Woodward"
upPerson(&pers1)
fmt.Printf("The name of the person is %s %s\n", pers1.firstName, pers1.lastName) // 2—struct as a pointer:
pers2 := new(Person)
pers2.firstName = "Chris"
pers2.lastName = "Woodward"
(*pers2).lastName = "Woodward" // 这是合法的
upPerson(pers2)
fmt.Printf("The name of the person is %s %s\n", pers2.firstName, pers2.lastName) // 3—struct as a literal:
pers3 := &Person{"Chris", "Woodward"}
upPerson(pers3)
fmt.Printf("The name of the person is %s %s\n", pers3.firstName, pers3.lastName)
}

程序输出:

The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD
The name of the person is CHRIS WOODWARD

使用反射访问struct的tag标签:

package main

import (
"fmt"
"reflect"
) type Person struct {
firstName string `An important answer`
lastName string `The name of the thing`
} func main() { tt := Person{"first", "last"}
for i := ; i < ; i++ {
refTag(tt, i)
}
}

程序输出:

Tag:An important answer    Name:firstName
Tag:The name of the thing Name:lastName

在值和指针上调用方法:

可以有连接到类型的方法,也可以有连接到类型指针的方法。

但是这没关系:对于类型 T,如果在 *T 上存在方法 Meth(),并且 t 是这个类型的变量,那么 t.Meth() 会被自动转换为(&t).Meth()

指针方法和值方法都可以在指针或非指针上被调用,收者类型是 *TwoInts 的方法 AddThem(),它能在类型 TwoInts 的值上被调用,这是自动间接发生的。

因此 two2.AddThem 可以替代 (&two2).AddThem()

再说一句,go中有方法继承与覆盖,不过必须是匿名字段o

最新文章

  1. Linux shell脚本编程(一)
  2. linux启动过程分析
  3. c++ 虚函数
  4. μC/OS-Ⅲ中的临界段代码
  5. 关于JAVA中对字符串与数组求长度的问题
  6. .NET MEF入门级例子
  7. java学习第12天
  8. WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
  9. Mysql 系统参数 系统变量 状态变量
  10. [Android开发常见问题-18] Connection to https://dl-ssl.google.com refused
  11. IOS 警告框 (UIAlertView)的使用方法
  12. phpeclipse
  13. Oracle 执行计划了的rows概念
  14. 使用PowerApps快速构建基于主题的轻业务应用 &mdash;&mdash; 进阶篇
  15. Android Multimedia框架总结(十八)Camera2框架从Java层到C++层类关系
  16. 解决svn检出后不显示图标的问题
  17. (转)CSS3之pointer-events(屏蔽鼠标事件)属性说明
  18. [2017BUAA软工助教]个人得分总表(至alpha结束)
  19. 使用Rider写一个C#的Hello World程序
  20. 安卓app开发-04- app运行的运行和调试

热门文章

  1. [HNOI2004]宠物收养所
  2. [BZOJ]4650 优秀的拆分(Noi2016)(哈希+二分)
  3. str中的join方法; set集合;深浅拷贝
  4. [Objective-C语言教程]常量(7)
  5. Postman使用手册2——管理收藏
  6. MODBUS协议相关代码(CRC验证 客户端程序)
  7. [Alpha]Scrum Meeting#2
  8. error C2955: “std::xx”: 使用 类 模板 需要 模板 参数列表
  9. C#根据工作经验来谈谈面向对象
  10. Vue.js路由跳转带参数到模板组件。