面向对象:go语言仅支持封装不支持继承和多态

     所以go语言没有class,只有struct(结构体)

     无论地址还是结构本身,一律用 . 来访问成员

     go语言编译器可以自动区分是值传递还是指针传递,值传递不会改变原值,指针传递会复制指针地址

        要改变内容必须使用指针接收者,结构过大也考虑用指针接收者,如果有指针接收者,最好用指针接收者

使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针:var t *T = new(T),如果需要可以把这条语句放在不同的行(比如定义是包范围的,但是分配却没有必要在开始就做)。

var t *T
t = new(T)

写这条语句的惯用方法是:t := new(T),变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值。

package main
import "fmt" type struct1 struct {
i1 int
f1 float32
str string
} func main() {
ms := new(struct1)
ms.i1 = 10
ms.f1 = 15.5
ms.str= "Chris" fmt.Printf("The int is: %d\n", ms.i1)
fmt.Printf("The float is: %f\n", ms.f1)
fmt.Printf("The string is: %s\n", ms.str)
fmt.Println(ms)
}

  

package main

import "fmt"

//结构体,相当于对象,实体
type TreeNode struct {
value int
left,right * TreeNode
} //(node TreeNode)相当于其他语言的this,表示print()是给node接收的
func (node TreeNode) print(){
fmt.Print(node.value," ")
} func (node *TreeNode) traverse(){
if node == nil{
return
}
node.left.traverse()
node.print()
node.right.traverse()
}
func (node *TreeNode) setValue(value int){
if node == nil{
fmt.Println("Setting nil value")
return
}
node.value = value
} //使用工厂函数来构造结构体
func createNode(value int) *TreeNode{
return &TreeNode{value:value}
} func main() {
var root TreeNode
fmt.Println(root)
root = TreeNode{value:3 }
root.left = &TreeNode{}
root.right = &TreeNode{5,nil,nil}
root.right.left = new(TreeNode)
root.left.right = createNode(2)
fmt.Println(root) root.traverse()
//nodes :=[]TreeNode{
// {value:5},
// {},
// {6,nil,&root},
//}
//fmt.Println(nodes) //root.print()
//root.right.left.setValue(8)
//root.right.left.print()
//fmt.Println()
//
//root.print()
//root.setValue(100)
//root.print()
//
//var pRoot *TreeNode
//pRoot.setValue(120)
//pRoot =&root
//pRoot.setValue(220)
//pRoot.print()
//root.print() }

使用工厂方法创建结构体实例

type File struct {
fd int // 文件描述符
name string // 文件名
}

下面是这个结构体类型对应的工厂方法,它返回一个指向结构体实例的指针:

func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
} return &File{fd, name}
}

然后这样调用它:

f := NewFile(10, "./test.txt")

  

最新文章

  1. 0.[WP Developer体验Andriod开发]之从零安装配置Android Studio并编写第一个Android App
  2. Scanner概述
  3. Struts1+JQuery的例子
  4. HDU 5348 MZL&#39;s endless loop 给边定向(欧拉回路,最大流)
  5. 如何在WINDOWS下编译BOOST C++库 .
  6. 常规页生命周期(class0620)
  7. 【Better Code】面向切面编程
  8. java各公司笔试题集1
  9. TCP慢启动,拥塞控制,ECN 笔记
  10. JS的this总结(上)-call()和apply()
  11. python3 爬取boss直聘职业分类数据(未完成)
  12. JS DOM与BOM
  13. laravel项目thinksns-plus安装出现RuntimeException Symlink from * to * failed错误
  14. CSS---伪类与伪元素的区别
  15. 异常处理——java基础
  16. Nginx安装,操作简单
  17. jmeter的使用
  18. Gym101485: NWERC 2015(队内第6次训练)
  19. hdu 4686 Arc of Dream(矩阵快速幂)
  20. 2016.5.21——Compare Version Numbers

热门文章

  1. 在Google Maps中导出KML文件
  2. IE9(8)跨域(CORS)解决方案
  3. git 基础学习笔记
  4. maven项目目录结构 学习笔记
  5. maven安装之后,或者升级之后遇到的问题:could not find or load main class org.codehaus.plexus.class.....
  6. L3-011 直捣黄龙 (30 分)
  7. 【.NET】AutoMapper学习记录
  8. BZOJ3732: Network(Kruskal重构树)
  9. Cannot find name &#39;AsyncIterator&#39; error in Typescript compilation process 问题解决
  10. chaos-engineering 的一些开源工具