• 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))
    }
  • 相关阅读:
    HADOOP高可用机制
    HDFS详解
    HBase详解
    大数据计算
    Flume+Sqoop+Azkaban笔记
    Kafka知识总结
    Kafka集群安装部署、Kafka生产者、Kafka消费者
    Hive详解
    Spark面试相关
    HDFS常用操作命令
  • 原文地址:https://www.cnblogs.com/wahgon/p/15472825.html
Copyright © 2020-2023  润新知