您的位置:首页 > 编程语言 > Go语言

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

2015-11-12 23:12 621 查看
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的突出优点是它对高并发的处理能力。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: