Golang - 指针与引用
Golang有指针 , 但是有些人生下来就是指针类型哇 , 跟Java的对象一样, 天生他就是一个指针类型. 但是Golang有些人不是哇, 他生下来不是指针类型. 难受不, 怎么区分呢 , 我教大家一个小妙招 . 看我下面这个例子
记住用伟大的Jetbrains的编译器Goland, 可以提示代码错误奥 !
package main
import "fmt"
func main() {
// 生下来一个ch
ch := make(chan int)
// ch如果是指针类型就可以和nil比较了
fmt.Println(ch==nil)
}
**就上诉一段代码 , 让你明白啥对象生下来我就是指针类型. 啥对象生下来他不是指针类型 , 如果你掌握了,我觉得那些书你不用看了 ,编程拼的就是巧和效率 , 如果有些人跟你说一堆 , 啥是引用类型,啥是按值传递 , 算了别看, 就看我这个, 他是误导你了, 是有些对象生下来他就是指针类型 , 懂了吗, 编译器做的你改不了, 你要改就写个编译器 . **
我给大家列出来 , 哪些对象哇 , 他生下来就是指针类型. 都是靠我上面的小技巧获取的,还有自己的一些经验
生下来就是指针类型
chan , 是一个阻塞队列,你可以这么理解, 后期学习吧, 类似于Java的BlockingQueue .
map , 伟大的map , 其实就是Java的HashMap.
切片(slice) , 就是没有指定长度的数组 ,类似于Java的ArrayList,会自动扩容.
函数 , 比如
fun := func(s string) string { return "modify" + s }interface : 一个类型为
interface{} 或者 interface接口的变量可能是指针变量 , 也可能是普通变量 .// 定义一个接口
type UserService interface {
}
// str可以是指针类型变量也可以是普通变量 , fun5也是
func fun4(str interface{}) {
}
func fun5(str UserService) {
} func main() {
// u 代表是一个指针类型变量或一个普通变量 ,同理 var x interface{} 也是代表一个指针类型变量或一个普通变量
var u UserService
// 调用
fun4(u)
fun5(u)
}
function type. 比如
type Func func(string), 这个 Func就是一个function type.type Func func(string)
func main() {
fun := Func(func(s string) {})
fmt.Println(fun == nil) // false
}
生下来不是指针类型的
struct , 如果成员变量为基本数据类型就是初始化值, 如果成员变量的指针类型则是nil.(前提你不赋值的情况下.)
基本数据类型,初始化值如下
bool //默认值为false
string //默认值为空字符串,为""
int int8 int16 int32 int64 //默认值为0
uint uint8 uint16 uint32 uint64 uintptr //默认值为0
byte // uint8 的别名
rune // int32 的别名
float32 float64 //默认值为0
complex64 complex128 //默认值为0
数组 , 数组是初始化就定义了大小的 , 记得与切片区分开.
两大操作符
操作符&(取址符) : 是返回该变量的内存地址。
操作符* (取值符) : 是返回该指针指向的变量的值, 同时也可以进行修改指针指向内存地址的值.
空指针 :
当一个指针类型的变量被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值.
占位符
%d 十进制整数
%x, %o, %b 十六进制,八进制,二进制整数。
%f, %g, %e 浮点数: 3.141593 3.141592653589793 3.141593e+00
%t 布尔:true或false
%c 字符(rune) (Unicode码点)
%s 字符串
%q 带双引号的字符串"abc"或带单引号的字符'c'
%v 变量的自然形式(natural format)
%T 变量的类型
%% 字面上的百分号标志(无操作数)
%p 打印指针类型的地址(十六进制)
Golang 的全部类型
这个是官方给的类型, 只有两种 一种是数值类型一种是派生类型.
数值类型
布尔型
bool布尔型的值只可以是常量true或者false,默认值为false。字符串类型
string编码统一为UTF-8编码标识Unicode文本,默认值为空字符串。整型(默认值为 0)
uint8: 无符号 8 位整型(0 ~ 255);uint16:无符号 16 位整型(0 ~ 65535);uint32:无符号 32 位整型(0 ~ 4294967295);uint64:无符号 64 位整型(0 ~ 18446744073709551615);int8:有符号 8 位整型(-128 ~ 127);int16:有符号 16 位整型(-32768 ~ 32767);int32:有符号 32 位整型(-2147483648 ~ 2147483647);int64:有符号 64 位整型(-9223372036854775808 ~ 9223372036854775807)
浮点型(默认值为 0)
float32:IEEE-75432 位浮点数;float64:IEEE-75464 位浮点数;complex64:32 位实数和虚数;complex128:64 位实数和虚数;
其他数值类型
byte:类似uint8;rune:类似int32;uint:32 或 64 位;int:与uint一样大小;uintptr:无符号整型,用于存放一个指针;
派生类型
- 指针类型(Pointer)
- 数组类型 ([len]byte)
- 结构化类型(struct)
- Channel 类型(chan)
- 函数类型(func)
- 切片类型(slice)
- 接口类型(interface)
- Map 类型(map)
Golang - 指针与引用的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- Golang指针
学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址. 那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不 ...
- [速记]关于指针,引用和递归和解递归——C++
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...
- C++指针参数引用
粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...
- C/C++:提升_指针的指针和指针的引用
C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.
- C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...
- C++学习笔记 指针与引用
指针与引用 1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...
- 数组类型与sizeof与指针的引用
以char类型为例: char a[100]; //a类型为char[100] &a类型为 char (*)[100] *a类型为char char *p = a; ...
- c++指针与引用问题
本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...
随机推荐
- 初识Contiv
Contiv是一个用于跨虚拟机.裸机.公有云或私有云的异构容器部署的开源容器网络架构.作为业界最强大的容器网络架构,Contiv具有2层.3层.overlay和ACI模式,能够与思科基础设施进行本地集 ...
- python 给三个数字排序,不用sort函数
# 给三个数字排序# 方法一def sort_d(a,b,c): if a>b: a,b=b,a # print (a,b) if b>c: b,c=c,b if a>b: a,b= ...
- C++模板特化与偏特化
C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样显然 ...
- mysql锁及四种事务隔离级别笔记
前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...
- 博帝飚速盘 16G
设备制造商: Patriot Memory当前协议 : USB2.0输入电流 : 300mA 芯片制造商: 群联(Phison)芯片型号 : PS2251-38闪存颗粒 : 美光( ...
- (推荐)linux用一键安装包
linux一键安装包内置了XXD.apache, php, mysql这些应用程序,不需要再单独安装部署. 从7.3版本开始,linux一键安装包分为32位和64位两个包,请大家根据操作系统的情况下载 ...
- Java事务失效
问题复现,用伪代码复现问题! 事务配置文件 <tx:advice id="txAdvice" transaction-manager="transactionMan ...
- Linux开发环境及应用—《第五周单元测验》《第六周单元测验》
1.与windows中"格式化磁盘"功能相对应的Linux命令是 mkfs 2.在Linux文件系统中,文件名也存放在磁盘上,存放于磁盘的下述哪个区域 文件存储区 3.传统Linu ...
- Spring Boot 添加Druid连接池(1.5 版本)
Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,地址:https://github.com/alibaba/druid .Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子 (莫队)
题目传送门:小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...