Go语言之流指针类型,new函数

这篇具有很好参考价值的文章主要介绍了Go语言之流指针类型,new函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
Go语言中使用对于指针存在两种操作: 取址和取值。

Go语言之流指针类型,new函数,Golang,golang,开发语言

var x = 100
// 取址符:&  取值符:*
fmt.Println("x的地址:", &x)
// 将地址值赋值给的变量称为指针变量
var p *int
p = &x
fmt.Println("p的值:", p)
fmt.Println("p地址对应的值", *p)

Go语言之流指针类型,new函数,Golang,golang,开发语言
关于地址的格式化打印

var x = 10
fmt.Printf("%p\n", &x)
x = 100
fmt.Printf("%p\n", &x)
fmt.Println(*&x)

关于指针的应用:

// 当使用等号将一个变量的值赋给另一个变量时,如 x = y ,实际上是在内存中将 i 的值进行了拷贝
var x = 10
var y = x
var z = &x
x = 20
fmt.Println(y)
fmt.Println(*z)
*z = 30
fmt.Println(x)

练习

var x = 10
var y = &x
var z = *y
x = 20
fmt.Println(x)
fmt.Println(*y)
fmt.Println(z) 

//=====================================

var a = 100
var b = &a
var c = &b
**c = 200
fmt.Println(a)

Go语言的指针类型变量即拥有指针高效访问的特点,又不会发生指针偏移和运算,从而避免了非法修改关键性数据的问题。

new函数

new 和 make 是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化 slice、map 和 channel。
之前我们学习的基本数据类型声明之后是有一个默认零值的,但是指针类型呢?

在Go语言中,new函数和make函数都用于创建新的对象,但是它们有不同的用途和适用范围。

  1. new函数:new函数用于创建值类型的对象,并返回一个指向该对象的指针。它的语法是new(T),其中T表示类型。new函数会分配内存,并将分配的内存初始化为零值,然后返回指向该内存的指针。这个指针可以直接访问和操作对象的字段。例如:
p := new(int) // 创建一个新的int类型对象,并返回指向该对象的指针
fmt.Println(*p) // 输出0,因为内存被初始化为零值
*p = 42 // 修改对象的值
fmt.Println(*p) // 输出42
  1. make函数:make函数用于创建引用类型的对象,如切片、映射和通道,并返回一个已初始化的对象。它的语法是make(T, args),其中T表示类型,args表示用于初始化的参数。make函数会分配内存,并初始化对象的相关字段,返回一个可以直接使用的对象。例如:
s := make([]int, 5) // 创建一个长度为5的切片,并初始化为零值
fmt.Println(s) // 输出[0 0 0 0 0]
s[0] = 1 // 修改切片的值
fmt.Println(s) // 输出[1 0 0 0 0]

总结:

  • new函数用于创建值类型的对象,并返回一个指向该对象的指针。
  • make函数用于创建引用类型的对象,并返回一个已初始化的对象。
  • new函数只分配内存,不进行初始化,返回的是指向零值的指针。
  • make函数分配内存并进行初始化,返回的是已初始化的对象。

需要根据具体的需求和类型选择使用new函数还是make函数。

var p *int
// fmt.Println(p)  // <nil>
// fmt.Println(*p) // 报错,并没有开辟空间地址
*p = 10. // 报错

我们可以看到初始化⼀个指针变量,其值为nil,nil的值是不能直接赋值的。通过内建的new函数返回⼀个指向新分配的类型为int的指针,指针值为0xc00004c088,这个指针指向的内容的值为零(zero value)。

 var p *int = new(int)
    fmt.Println(p)  // 0x14000122008
    fmt.Println(*p) // 0
    *p = 10
    fmt.Println(*p) // 10

Go语言之流指针类型,new函数,Golang,golang,开发语言

make返回的还是引⽤类型本⾝;⽽new返回的是指向类型的指针。后面再详细介绍文章来源地址https://www.toymoban.com/news/detail-568776.html

func1_指针1() {
	//&变量,获取变量地址
	var x = 10
	fmt.Printf("赋值之前x的对应地址:%p\n", &x)
	x = 100
	fmt.Printf("赋值之后x的对应地址:%p\n", &x)
	fmt.Println(x)
}
func2_指针2() {
	//取址
	//赋值
	//取值

	//(1) 或取地址:&变量
	var x = 10 //x称为整型变量
	//(2) 地址赋值:指针类型
	var p *int //p是一个整型指针类型
	p = &x     // var p = &x
	fmt.Println(p)
	//(3)取值操作,*指针变量
	fmt.Println(*p, reflect.TypeOf(*p))
}
func3_接收指针类型() {
	//指针类型存储地址值
	//地址本身也有一个类型
	var x = 10
	fmt.Println(&x)
	//p就是指针变量
	var p *int
	p = &x
	fmt.Println(p)
	fmt.Println(*p, reflect.TypeOf(*p))
	*p = 100
	fmt.Println(*p)
	fmt.Println(x)
}
func4_思考题() {
	var a = 1
	var b = a
	b = 100
	fmt.Println(a, b)
	//如何指向同一块儿空间
}
func5_指针案例3() {
	var a = 100
	fmt.Println(reflect.TypeOf(a))
	var b = &a
	fmt.Println(reflect.TypeOf(b))
	var c = &b
	fmt.Println(reflect.TypeOf(c))
	**c = 200
	fmt.Println(a)
}
func6_指针案例4() {
	p1 := 1   //p1类型
	p2 := &p1 //*int类型
	*p2++
	fmt.Println(p1)
	fmt.Println(*p2)
}
func7个_new函数1() {
	//基本数据类型(整型浮点型,字符串,布尔,数组,结构体,类型)属于值类型
	//值类型的特定:当声明未赋值之前存在一个默认值(zero value)
	var x int
	var name string
	fmt.Println(x, name)

	//指针类型属于引用类型,包括切片,map,channel都属于引用类型
	//引用类型当声明未赋值之前是没有开辟空间的,即没有默认值
	var p *int
	p = new(int)
	*p = 10
	fmt.Println(*p)
}

到了这里,关于Go语言之流指针类型,new函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(85)
  • Golang开发-new关键字

    在Go语言中,new用于创建一个新的零值对象,并返回指向该对象的指针。它是Go语言中用于分配内存的一种方式。 new的语法如下: 其中,Type表示要创建的对象的类型,ptr是指向新对象的指针。 以下是一个示例,演示如何使用new创建一个新的对象: 在上述

    2024年02月09日
    浏览(44)
  • Golang struct 结构体指针类型 / 结构体值类型

    结构体变量之间的赋值是值拷贝。 当需要通过变量去修改另外一个结构体内容的时候,可以通过传递地址的方式来达到这个效果。 这样使用肯定是不对的,因为.的运算优先级要高,所以先会去执行p2.age,之后又取地址,所以这个就不行。 在代码执行的时候先执行.的操作,

    2024年02月13日
    浏览(43)
  • 100天精通Golang(基础入门篇)——第12天:深入解析Go语言中的集合(Map)及常用函数应用

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(50)
  • 100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月12日
    浏览(68)
  • 【golang】每日chatGPT:golang中实现ENUM枚举类型 | go enum

    在golang极简的哲学思想中,没有内置枚举类型 这里我们通过map+iota去实现一个枚举类型 枚举值如下: key value 1 发电类 2 储能类 13 负荷类 打印如下: 发电类 储能类 负荷类 ========= 储能类

    2024年02月15日
    浏览(46)
  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(59)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(69)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(61)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包