跟着猫哥学Golang[10] - new & 指针

Golang不愧是C和JavaScript的混合体,既有new,也有指针。只不过Golang的指针没有指针运算。


1. 先说Golang的指针,类似于C语言指针,星号(*)来表示,and符号(&)取地址。

这里必须跟初学者说明,很多教材讲到指针时候都跟结构体(Struct)配合着讲,让初学者误以为指针是配合结构体的。其实不然,任何数据类型都可以用指针。来看下面的例子:

package main

import "fmt"

func main() {
	var p1 *int
	i := 10
	p1 = &i
	fmt.Println("*p1 =",*p1)
	fmt.Println("p1 =", p1)
	
	var p2 *string
	str1 := "test string"
	p2 = &str1
	fmt.Println("*p2 =",*p2)
	fmt.Println("p2 =",p2)
 var p3 *float32
// fmt.Println("*p3 =", *p3)  //没有内容,打印会出错的。
 fmt.Println("p3 =", p3)
}
# 输出
*p1 = 10
p1 = 0xc0820022d0
*p2 = test string
p2 = 0xc082002340
p3 = <nil>

使用方法是不是跟C语言一样的?p3是个空指针,默认为nil,没内容的指针是不能打印的,会报编译错误。

指针配合结构体的例子这里不举了,太多了。


2. Golang的new

表达式 new() 分配了一个零初始化的值,并返回一个该类型指针。知道为什么先说指针再说new了吧?

new有两种用法:

t := new (T)  或  var t *T = new (T)

也是类似指针的,太多例子都直接把指针、new和struct放在一起。诚然,结构体的new、指针操作更有意义,但是不代表其它类型就不行了。

来一起看看下面的例子,了解一下new关键字。

package main

import "fmt"

type struct1 struct {
	x int
	y float32
	z string
}

func main() {
	t1 := new (int)
	fmt.Println("t1 =",t1)
	fmt.Println("*t1 =",*t1)
	
	var t2 *string = new(string)
	fmt.Println("t2 =",t2)
	fmt.Println("*t2 =",*t2)
	
	t3 := new(struct1)
	fmt.Println("t3 =",t3)
	fmt.Println("*t3 =",*t3)
}
#输出
t1 = 0xc0820022d0
*t1 = 0
t2 = 0xc082002330
*t2 = 
t3 = &{0 0 }
*t3 = {0 0 }

新声明的都会返回一个空或者逻辑“假”的值,如果是字符串则直接就是空白的。


3. new不是声明类的实例...

一开始,受OO思维熏陶出来的猫哥也惶惶然以为有了new,有了结构体绑方法(后面章节会讲到),Golang也会有类似于“class”的概念。

后来猫哥发现自己想错了,OO三要素,Golang一个也不满足。所以,Golang肯定不是一门面向对象语言,甚至伪面向对象都不是。它就是一门面向过程语言。

21世纪,面向过程语言一样可以完成它的任务,况且Golang的突出优点是它对高并发的处理能力。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值