• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Gonew函数例子解析答疑

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
package main

import "fmt"

func main() {
	p1 :=new(int)
	*p1 =1
	fmt.Println("p1",p1)
	fmt.Println("*p1",*p1)
	fmt.Println("&p1",&p1)

	s1 := new([]int)
	s2 := []*int{}
	s3 := []int{1,2}

	s2 =append(s2,p1)
	fmt.Println("s1: ", s1)
	fmt.Printf("s2:%v\n", s2)
	fmt.Printf("s2:%T\n", s2)
	fmt.Println("s3: ", s3)


}

输出

p1 0xc00000a0d0
*p1 1
&p1 0xc000006028
s1:  &[]
s2:[0xc00000a0d0]
s2:[]*int
s3:  [1 2]

s1 将创建一个[]int类型的匿名变量,初始化为[]int类型的零值,然后返回变量地址,返回的指针类型为 *[]int 。

s2 声明创建一个int指针类型的空切片。

s3 声明创建一个int类型的切片,初始化字面量1,2。

s1是指针地址,s2是存放指针地址的切片,s3就是一个切片。

用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,还可以在表达式中使用new(T)。new函数类似是一种语法糖,直接返回变量的地址,而不是一个新的基础概念。

下面的两个newInt函数有着相同的行为:

func newInt() *int {
    return new(int)
}

func newInt() *int {
    var dummy int
    return &dummy
}

每次调用new函数都是返回一个新的变量的地址,因此下面两个地址是不同的:

p := new(int)
q := new(int)
fmt.Println(p == q) // "false"

当然也可能有特殊情况:如果两个类型都是空的,也就是说类型的大小是0,例如struct{}[0]int,有可能有相同的地址。

new函数使用常见相对比较少,因为对应结构体来说,可以直接使用字面量语法创建新变量的方法会更灵活。

由于new只是一个预定义的函数,它并不是一个关键字,因此可以将new名字重新定义为别的类型。例如下面的例子:

func delta(old, new int) int { return new - old}

由于new被定义为int类型的变量名,因此在delete函数内部是无法使用内置的new函数的。

问题二 s2如何才能像s3一样直接赋值?

s2是int类型指针切片,直接存放int类型的指针地址就好

问题三 s2赋完值之后如何才能打印出来值类型?

参考:Go语言fmt.Sprintf、fmt.Printf(格式化输出)

%T 	输出 Go 语言语法格式的类型和值

fmt.Printf("s2:%T\n", s2)

输出

s2:[]*int

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言学习之可变参数函数发布时间:2022-07-10
下一篇:
MyHeartWillGoOn发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap