zoukankan      html  css  js  c++  java
  • go new和make区别

    new用于任何类型,返回的是指针,多用在对象,结构体

    make类型只用于slice,map,channel,返回引用,为什么只这三个用make,因为它们都有要初始化的数据,参数golang 内置函数new()和make()的区别

    示例

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	
    	var aa []int
    	cc := []int{13, 2, 34}
    	// 打印 [13 2 34]
    	fmt.Println(cc)
    	// 打印的是切片数组地址,切片内存【数组址址-长度-容量】,cc内容以指针显示就是打印了前面的指针地址
    	fmt.Printf("%p\n", cc)
    	// 打印切片变量地址,内址地址以指针显示打印
    	fmt.Printf("%p\n", &cc)
    	// 打印 &[13 2 34]
    	fmt.Println(&cc)
    
    	fmt.Println(&aa)
    	fmt.Printf("%p\n", aa)
    	fmt.Printf("%p\n", &aa)
    
    	// 修改后切片变量地址不变,切片数组地址改变
    	aa = []int{13, 34}
    	fmt.Println(&aa)
    	fmt.Printf("%p\n", aa)
    	fmt.Printf("%p\n", &aa)
    
    	dd := []int{13, 2, 34}
    	// 和dd共用一个数组,dd,ee元素改变会相互影响
    	ee := dd[1:3]
    	ee[1] = 100
    	// append会改变切片的数组地址
    	ee = append(ee, 1111)
    	ee[1] = 200
    	fmt.Println(dd)
    	fmt.Println(ee)
    
    }

    切片cap容量够的话append不会增加改变数组地址

    [x:y]容量为原切片容量-x

    package main
    
    import (
    	"fmt"
    )
    
    type Animal struct {
    }
    
    func (m *Animal) Eat() {
    	fmt.Println("Eat")
    }
    
    func main() {
    	rr := make([]int, 3, 5)
    
    	rr[0] = 12
    	rr[1] = 112
    	rr[2] = 1222
    
    	cc := rr[0:2]
    	fmt.Println(len(cc))
    	fmt.Println(cap(cc))
    
    	// 打印 [13 2 34]
    	fmt.Println(cc)
    	// 打印的是切片数组地址
    	fmt.Printf("%p\n", cc)
    	// 打印切片变量地址
    	fmt.Printf("%p\n", &cc)
    	// 打印 &[13 2 34]
    	fmt.Println(&cc)
    
    	cc = append(cc, 22)
    
    	// 打印的是切片数组地址
    	fmt.Printf("%p\n", cc)
    	// 打印切片变量地址
    	fmt.Printf("%p\n", &cc)
    	fmt.Println(&cc)
    	// fmt.Println(&dd)
    }
    
    package main
    
    import "fmt"
    
    func SlicePrint(s []int)  {
    	s=append(s,0)
    	for i:=range s{
    		s[i]++
    	}
    }
    func main() {
    
    	s1:=[]int{1,2}
    	s2:=s1
    
    	s2=append(s2,3)
    	s1=append(s1,3)
    	fmt.Println(len(s2),cap(s2))
    	fmt.Println(len(s1),cap(s1))
    	SlicePrint(s1)
    	SlicePrint(s2)
    	fmt.Println(s1,s2)
    	fmt.Printf("%p\n", s1)
    	fmt.Printf("%p\n", s2)
    	fmt.Println(len(s2),cap(s2))
    }

    append多个数不够时就两个两个的增加cap,而append单个时如果不够就会扩容两倍

    go1.17 append(x,1,2,3)cap是3不是4

    package main
    
    import "fmt"
    
    func main() {
    
    	var s1 []int = []int{1,2}
    
    	fmt.Println(len(s1),cap(s1))
    	s1=append(s1,32)
    
    	fmt.Println(len(s1),cap(s1))
    	s1=append(s1,32)
    
    	fmt.Println(len(s1),cap(s1))
    	s1=append(s1,32)
    
    	fmt.Println(len(s1),cap(s1))
    
    	var s2 []int
    
    	fmt.Println(len(s2),cap(s2))
    	s2=append(s2,32)
    
    	fmt.Println(len(s2),cap(s2))
    	s2=append(s2,32)
    
    	fmt.Println(len(s2),cap(s2))
    	s2=append(s2,32)
    
    	fmt.Println(len(s2),cap(s2))
    
    	s2=append(s2,32,3,4,1,1,2,1,2)
    
    	fmt.Println(len(s2),cap(s2))
    	s2=append(s2,32,3,4,1,1,2,1,2)
    
    	fmt.Println(len(s2),cap(s2))
    	s2=append(s2,3)
    
    	fmt.Println(len(s2),cap(s2))
    }
  • 相关阅读:
    基于jquery后台框架设计(自适应高度,iframe简易版)
    发布mvc遇到的HTTP错误 403.14Forbidden解决办法
    编译器错误消息: CS0012: 类型 在未被引用的程序集中定义。必须添加对程序集 的引用
    jquery获取iframe里的js事件
    js获取浏览器相关尺寸
    CSS半透明兼容写法
    sharepoint 添加解决方案 遇到的问题
    WCF开发小结
    TDD(测试驱动开发/TestDriven Development)
    asp.net 2.0 读取 资源文件
  • 原文地址:https://www.cnblogs.com/wahgon/p/15472825.html
Copyright © 2011-2022 走看看