Go new函数 例子解析答疑
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,s2,s3的区别是什么?
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
Go new函数 例子解析答疑的更多相关文章
- Generator函数语法解析
转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...
- Tensorflow-hub[例子解析2]
接Tensorflow-hub[例子解析1]. 3 基于文本词向量的例子 3.1 创建Module 可以从Tensorflow-hub[例子解析1].中看出,hub相对之前减少了更多的工作量. 首先, ...
- 两个实例轻松理解js函数预解析
js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console ...
- 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。
split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...
- Poco库网络模块例子解析1-------字典查询
Poco的网络模块在Poco::Net名字空间下定义 下面是字典例子解析 #include "Poco/Net/StreamSocket.h" //流式套接字 #include ...
- 非分离线程未使用join函数例子:
//非分离线程未使用join函数例子: #include<stdlib.h> #include<pthread.h> #include<stdio.h> #incl ...
- [教程]Delphi 中三种回调函数形式解析
Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...
- windows窗口过程函数名词解析
windows窗口过程函数名词解析 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 1. LR ...
- mask-rcnn代码解读(六):resize_image()函数的解析
我已经根据resize_image()函数的解析对原图像与resize图像进行了解析, 若有读者想对原图像与目标图像不同尺寸验证,可根据以下代码,调整函数参数, 其细节如下: import cv2 a ...
- Java字节码例子解析
举个简单的例子: public class Hello { public static void main(String[] args) { String string1 = ...
随机推荐
- Scoop: 开发者多环境管理利器
Scoop是什么? Scoop 是一个基于 Windows 的包管理器,能够帮助开发者高效管理开发环境和应用程序. 它推荐通过命令行进行包的安装.更新和卸载,同时提供了简单易用的包组织方式,透明化了安 ...
- Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图
一.前言说明 地址和经纬度坐标转换的功能必须在线使用,一般用在导航需求上,比如用户输入起点地址和终点地址,查询路线后,显示对应的路线,而实际上各大地图厂家默认支持的是给定经纬度坐标来查询(百度地图支持 ...
- [转]Pelco-D协议使用
1.Pelco-D协议格式如下图所示: 2. 通用示例为:水平向右控制 FF address 00 02 Hspeed 00 checksum水平向左控制 FF address 00 04 Hspee ...
- SSM或Spring Boor开发中@Repository和@Mapper的区别
在做一个SpringBoot项目的时候在Dao层使用了@Repository注解然后报了这个错: Description: Field userService in com.example.demo. ...
- P1437 敲砖块 题解
题意 在一个凹槽中放置了 \(n\) 层砖块.最上面的一层有 \(n\) 块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示: 14 15 4 3 23 3 ...
- WPF Play Image slider animation using Storyboard
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- biancheng-JSTL标签库
JSP 标签是一组与 HTML 标签相似,但又比 HTML 标签强大的功能标签.JSTL 用来简化 JSP 开发,可以使我们不用嵌入 Java 代码就能够开发出复杂的 JSP 页面.JSTL 包含 5 ...
- biancheng-HBase
目录http://c.biancheng.net/view/6509.html 1HBase是什么?2HBase的优势有哪些?3Hadoop与HBase的关系4HDFS5HDFS的特点与使用场景6HB ...
- Spring Cloud认知学习(一)--Eureka使用、Ribbon使用
Spring Cloud是一个微服务架构,他有多种组件来管理微服务的方方面面.Spring Cloud是用于构建微服务开发和治理的框架的集合. Spring Cloud是最热门的Java技术毋庸置疑. ...
- C# 使用NPOI生成Excel文件——合并单元格、设置Style
using System; using System.IO; using NPOI.HSSF; using NPOI.HPSF; using NPOI.HSSF.UserModel; using NP ...