zoukankan      html  css  js  c++  java
  • go_结构体和方法

    面向对象: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
    ", ms.i1)
        fmt.Printf("The float is: %f
    ", ms.f1)
        fmt.Printf("The string is: %s
    ", 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")

      

  • 相关阅读:
    discuz论坛X3升级时 文件下载出现问题,请查看您的服务器网络以及data目录是否有写权限
    discuz管理中心无法登陆
    在Windows 7下面IIS7的安装和 配置ASP的正确方法
    window.open
    linux下的vmware虚拟机如何回收虚拟磁盘空间
    CentOS7 安装lamp 3分钟脚本
    pyhon 编译C++安装需要 c99 模式
    条件判断
    python字符串杂项
    RIPv1&v2
  • 原文地址:https://www.cnblogs.com/luffe/p/8548517.html
Copyright © 2011-2022 走看看