golang 中的指针

# golang 中的指针

看了一篇[文章](http://blog.51cto.com/steed/2341409),写的很好。这里略微总结下重点:

1. 地址值、unsafe.Pointer、uintptr 的关系

- 地址值 与 unsafe.Pointer 可以互相转换

- uintptr 与 unsafe.Pointer 可以互相转换

- 地址在 与 uintptr 不能互相转换

2. 不可寻址的值 (需要指出的是,不可寻址是强行约定的,多数是因为安全)

- 不可变的值不可寻址,包括常量、字面值、字符串变量的值、函数及方法的字面值。

- 临时结果,也就是未被接收的结果,有个例外是切片。

- 破坏一致性的指针,如字典的value。

3. 鉴于上面的内容,下面的代码就很有意思了

```golang

package main

import "fmt"

func main() {

// fmt.Println(New().String()) //error!此处行不通!

u := New()

fmt.Println(u.String())

}

//User is a demo struct

type User struct {

name string

}

//receiver is ptr!

func (u *User) String() string {

return fmt.Sprintf("User{name=%s}", u.name)

}

//New is to create User!

func New() User {

return User{"default"}

}

```

4. reflect.Type/Value可以处理struct的exported字段,那么unexported字段怎么处理呢?

答案是使用 unsafe.Offsetof,配合 uintptr 和 unsafe.Pointer 来处理!

原文地址:https://www.cnblogs.com/larryzeal/p/10258288.html

时间: 2024-10-29 12:31:27

golang 中的指针的相关文章

Golang 中的指针 - Pointer

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用

golang中的数组

概念:指同一系列同一类型数据的集合. 声明方法如下: [32]byte                          //长度为32的数组 [2*N] struct { x, y int32}  //复杂类型的数组 [1000]*float64                //指针数组 [3][5]int                          //二维数组 [2][2][2]float64              //等同于[2]([2]([2]float64)) 获取数组长

golang中省略返回值造成内存泄漏

我已经两次因为不恰当的省略go中的函数返回值,一次造成MySql的too many connection错误,一次造成严重的内存泄漏.所以在这里大家分享一下这个问题和解决办法,也提醒自己以后不要再犯类似的错了. 众所周知,go中的函数可以返回多个值.但很多时候我们并不需要所有的值,而且go中定义了一个变量必须使用才可以,不然会报错.所以对于不需要的返回值,一般的操作方法就是省略: for _,value := range slice{ //.... } 一个典型就是上面的range.range可

在Golang中使用C语言代码实例

转自:http://www.jb51.net/article/56720.htm cgo 使得在 Golang 中可以使用 C 代码. Hello World 为了有一个较为直观的了解,我们来看一个简单的例子,创建文件 main.go: package main /* #include <stdio.h> void sayHi() { printf("Hi"); } */ import "C" func main() { C.sayHi() } 执行程序

golang中接口interface和struct结构类的分析

再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和指针成员,这里先不讲,重点讲解interface和struct这两种特殊的数据类型. interface和struct也是数据类型,特殊在于interface作为万能的接口类型,而struct作为常用的自定义数据类型的关键字.说到这里相比大家已经明白interface的侧重点在于接口的定义(方法),

golang中Array与Slice

在golang中有数组和Slice两种数据结构,Slice是基于数组的实现,是长度动态不固定的数据结构,本质上是一个对数组字序列的引用,提供了对数组的轻量级访问.那么在go的函数中以数组或Slice为形参的时候就存在一些差别. ? 首先,golang中是值传递,并且如果传递的参数是数组的时候并不会隐式将数组作为引用或者指针传入,而是传入副本,而如果想轻量级传递数据,这个时候就需要使用slice了. 可以通过一个简单的例子来验证这个机制: package main import "fmt"

golang中fmt的&#39;占位符&#39;使用

golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式. Printf("%v", people) {zhangsan}, %+v 打印结构体时,会添加字段名 Printf("%+v",

golang中interface接口的深度解析

什么是interface,简单的说,interface是一组method的组合,下面这篇文章主要给大家深度解析了关于golang中的interface接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 一 接口介绍 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所

golang中,slice的几个易混淆点

slice在golang中是最常用的类型,一般可以把它作为数组使用,但是比数组要高效呀.不过,我感觉这个东西用的不好坑太多了.还是需要了解下他底层的实现 slice的结构定义 type slice struct { array unsafe.Pointer len int cap int } 看结构定义,就三个字段,那个指针指向的就是底层数组,所以说slice的底层结构就是数组. slice的声明 第一种方式 var s []int #和数组差不多,[]中间不要数字 第二种方式 s :=[]in