26、Go 复合数据类型 - 切片(slice)

作者: 温新

分类: 【Go基础】

阅读: 589

时间: 2023-08-29 16:02:46

hi,我是温新

在 GO 语言中,newmake 都用来分配内存nwe 只用于内存分配,make 用于 slicemapchannel 的初始化。

new 函数

new(类型) 函数一个内置函数,用于分配内存。下面通过案例来学习 new 函数的使用。

已存在变量

对于一个已经存在的变量,可以使用指针进行赋值。

package main

import "fmt"

func main() {
    // 声明一个变量
    var p int
    // 把变量 p 的指针赋值给 变量 v
    v := &p
    // 通过指针修改值
    *v = 100
    fmt.Println(p, *v) // 100 100
}

声明指针变量

1)声明指针变量

package main

import "fmt"

func main() {
    // 声明指针变量 p
    var p *int
    fmt.Println(p) // 值为 <nil>

    // 对指针变量赋值
    *p = 100
}

1、声明了一个指针变量 p,此时在内存中开辟出一块空间,其存储的值为 <nil>。注意开辟了内存空间,存的值是 nil,但是没有分配内存地址;

2、*p 通过地址赋值,此时就会报错,原因是指针变量 p,开辟了内存空间但是没有内存地址,其报错如下:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0xb9def1]

2)使用 new 函数分配内存地址

package main

import "fmt"

func main() {
    var p *int

    // 使用 new 函数变指针变量初始化内存地址
    p = new(int)

    *p = 100
    fmt.Println(*p)
}

1、初始化一个指针变量时,它的值是 nilnil 无法直接赋值;

2、使用 new 函数返回一个指向新分配的类型为 int ·的指针,该指针指向的内容的值为 零,并值地址指向到指针变量 p;

3、为指针变量赋值。

请登录后再评论