zoukankan      html  css  js  c++  java
  • go语言学习七

    package stack
    
    import "errors"
    
    type Stack []interface{}
    
    func (s *Stack) Len() int {
    	return len(*s)
    }
    
    func (s *Stack) Cap() int {
    	return cap(*s)
    }
    
    func (s *Stack) Push(x interface{}) *Stack {
    
    	*s = append(*s, x)
    
    	/**
    
    	如果改为
    	z := append(*s, x)
    	s = &z
    
    	1. 不将函数返回值赋给一个变量,而是直接对一个函数取地址:象这样:s = &(append(*s,x)) 是不允许的
    	原因可能是:函数的返回值是一个在函数内部作用域的局部变量,在函数结束后如果没有传值到外部调用者的话作用域就会结束(同时空间被GC回收)
    	对这样的局部变量取地址是不行的。
    	如果返回值直接是一个指针(地址) 当然可以直接赋给外部变量,所以应该可以对返回指针的函数取值 如下
    		func foo1() *int { x := 4; return &x }
    		func foo2() int  { x := 4; return x }
    
    		fmt.Println(*foo1()) //ok
    		fmt.Println(&foo2()) //no
    
    
    
    	2. 直接修改地址指向,在外部调
    		s := stack.Stack{1, 2, 3}
    		s.Push(4).Push(5).Push(6)
    		fmt.Println(s)
    	返回的仍然是 {1,2,3}
    
    	原因是:方法的接受者虽然是指针,但方法内部只不过是将地址的值传值引用进来,
    	在方法内部你可以利用这个传进来的地址值 对地址所在位置的内存进行修改,但你如果改变地址指向本身
    	却是对外部没有影响的,总之从这点上看,以前学C语言时有个高人说过:
    	“本质上,函数其实都是传值调用的,只不过有时传递是变量值,有时传的是地址值”
    	 */
    
    	return s
    }
    
    func (s *Stack) Top() (interface{}, error) {
    
    	n := s.Len()
    	if n == 0 {
    		return nil, errors.New("can not get top from an empty stack")
    	}
    
    	return (*s)[n-1], nil
    }
    
    func (s *Stack) Pop() (interface{}, error) {
    
    	n := s.Len()
    	if n == 0 {
    		return nil, errors.New("can not pop an empty stack")
    	}
    
    	top := (*s)[n-1]
    	*s = (*s)[:n-1]
    
    	return top, nil
    }
    

      

  • 相关阅读:
    从Kratos设计看Go微服务工程实践
    京东到家安全测试实践
    浅谈 Protobuf 编码 原创 gsonli 腾讯技术工程 2021-07-14
    API Design Guide
    The power of two choices in randomized load balancing
    NGINX and the "Power of Two Choices" Load-Balancing Algorithm
    SRE 崩溃
    DDoS木马
    String.fromCharCode(88,83,83) 方法返回由指定的 UTF-16 代码单元序列创建的字符串
    汇编语言的AX,BX,CX,DX,分别表示什么
  • 原文地址:https://www.cnblogs.com/scala/p/9569787.html
Copyright © 2011-2022 走看看