new 返回的是a对象的指针
func main() { a := new(int) fmt.Println(a) fmt.Println(&a) fmt.Println(*a) }
***************
0xc000058058 打印指针,就是打印这个指针对应变量的 内存地址
0xc000084018 答应&a,就是打印指针的内存地址
0 打印*a 就是打印指针对应的变量的 值
-------------------------------------------------------------------------------
int是简单类型,如果用复合类型 演示结果稍有不同
func main() {
a := new([3]int)
fmt.Println(a)
fmt.Println(&a)
fmt.Println(*a)
}
**********************
&[0 0 0]
0xc000084018
[0 0 0]
总结一下;;;;;;感觉没什么用
make
只能用于切片,映射和管道
func main() { a := make([]int, 5, 10) fmt.Println(a) a[0] = 100 fmt.Println(a) }
***************
[0 0 0 0 0]
[100 0 0 0 0]
说明:::一般情况下,go的函数执行时都是按值传参,,但是make是个例外,,所以上面例子修改a[0],再次打印时,a[0]会被修改
切片的视图操作 view
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} //取切片 s1 := arr[2:] //修改值 s1[0] = 100 fmt.Println(s1) fmt.Println(arr)
**********************************************
[100 3 4 5 6 7]
[0 1 100 3 4 5 6 7]
s3 := arr[2:6]
fmt.Println(s3)
s4 := s3[3:5]
fmt.Println(s4)
append 和 copy
append
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1:= arr[2:6] fmt.Println(s1)
s2 := s1[3:5] fmt.Println(s2)
s3 := append(s2,10) fmt.Println(s3) fmt.Println(arr)
s4 := append(s3,11) fmt.Println(s4) fmt.Println(arr)
s5 := append(s4,12) fmt.Println(s5) fmt.Println(arr)
copy
copy是从前面开始算的
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} //取切片 //8,9 s1 := data[8:] s2 := data[:5] // 将后面切片元素,拷贝到前面切片里面 //copy()是从前往后添加 copy(s2, s1) fmt.Println(s1) fmt.Println(s2) fmt.Println(data)
******************************
[8 9]
[8 9 2 3 4]
[8 9 2 3 4 5 6 7 8 9]
map
l Map 是go内置的数据结构,是一种无序的键值对的集合,可以通过key快速找到value的值
m2 := map[int]string{1:"hello",2:"world"}
结构体
package main import "fmt" type Person struct { id int name string age int } func main() { //位置参数 p1 := Person{1, "godie", 18} //指定参数 p2 := Person{name: "sm", age: 56} fmt.Println(p1) fmt.Println(p2) //指针 var a *Person = &Person{3, "ko", 12} fmt.Println(a) fmt.Println(*a) fmt.Println((*a).name) }
************************************
{1 godie 18}
{0 sm 56}
&{3 ko 12}
{3 ko 12}
k
在查找属性的时候,指针会首先找到变量名,再去找变量的属性
切片是基于数组实现的,,,,
有了数组还要切片干什么,,,因为数组是固定长度的,使用有诸多不便,
切片克服了这一缺陷
定义一个空切片
a := []int{1, 5, 1, 1, 5, 5, 5}
fmt.Println(a[1])
或者可以通过已经声明的数组,截取部分作为切片
var a [5]int = [5]int{1, 5, 2, 5, 2}
var b []int = a[0:2]
可以用 nil 来判断 是否为空
切片可以使用数组的所有操作方式,,