当前位置:网站首页>Go-指针的那些事
Go-指针的那些事
2022-08-09 09:27:00 【草明】
<<Go 语言核心 36 讲>> 郝林 总结的
不可寻址的值:
- 常量的值。
- 基本类型值的字面量。
- 算术操作的结果值。
- 对各种字面量的索引表达式和切片表达式的结果值。不过有一个例外,对切片字面量的索引结果值却是可寻址的。
- 对字符串变量的索引表达式和切片表达式的结果值。
- 对字典变量的索引表达式的结果值。
- 函数字面量和方法字面量,以及对它们的调用表达式的结果值。
- 结构体字面量的字段值,也就是对结构体字面量的选择表达式的结果值。
- 类型转换表达式的结果值。
- 类型断言表达式的结果值。
- 接收表达式的结果值。
规律:
- 不可变的 - 寻址没有意义, 不能改
- 临时结果 - 例外, 切片字面量的索引结果值.
- 不安全的 - "不安全的"操作很可能会破坏程序的一致性,引发不可预知的错误,从而严重影响程序的功能和稳定性。
上代码, 自己品
package main
type Pet interface {
Name() string
Category() string
}
type Dog struct {
name string
}
func (self Dog) SetName(name string) {
self.name = name
}
func (self Dog) Name() string {
return self.name
}
func (self Dog) Category() string {
return "Dog"
}
func New(name string) Dog {
return Dog{
name}
}
func main() {
// 不会报错. 不需要指针类型调用 SetName
New("Max").SetName("Bear")
}
package main
type Pet interface {
Name() string
Category() string
}
type Dog struct {
name string
}
func (self *Dog) SetName(name string) {
self.name = name
}
func (self *Dog) Name() string {
return self.name
}
func (self *Dog) Category() string {
return "Dog"
}
func New(name string) Dog {
return Dog{
name}
}
func main() {
dog := New("Max")
dog.SetName("Bear") // 编译器会自动转换成 (&dog).SetName("Bear")
// 会报错, 因为 New("Max") 是临时结果, 不可以寻址, 无法获取指针
New("Max").SetName("Bear")
// cannot call pointer method on New("Max")
// cannot take the address of New("Max")
}
package main
import (
"fmt"
)
func main() {
map[string]int{
"the": 0, "word": 0, "counter": 0}["word"]++
map1 := map[string]int{
"the": 0, "word": 0, "counter": 0}
map1["word"]++
fmt.Println(map1["word"]) // 1
}
package main
import (
"fmt"
"unsafe"
)
type Dog struct {
name string
}
func (self *Dog) SetName(name string) {
self.name = name
}
func (self *Dog) Name() string {
return self.name
}
func (self *Dog) Category() string {
return "Dog"
}
func main() {
dog := Dog{
}
dog.SetName("Max")
dogP := &dog
dogPtr := uintptr(unsafe.Pointer(dogP))
namePtr := dogPtr + unsafe.Offsetof(dogP.name)
nameP := (*string)(unsafe.Pointer(namePtr))
fmt.Println(*nameP) // Max
namePtr = dogPtr + 64
unknownP := (*[]byte)(unsafe.Pointer(namePtr))
fmt.Println(*unknownP) // 内存泄漏, 获取到了某个地址指向的数据. 如果改了, 可能会导致不可知的问题
}
边栏推荐
猜你喜欢
"The camera can't be used" + win8.1 + DELL + external camera + USB drive-free solution
These 12 GIS software are better than the other
try catch 对性能影响
常用功能测试的检查点与用例设计思路
软件测试的流程规范有哪些?具体要怎么做?
Do you know the principles of test cases and how to write defect reports?
记录一次被入侵5900端口经历
字典
【百日行动】炎炎夏日安全不松懈 消防培训“加满”安全知识“油”
银联最新测试工程师笔试题目,你能得多少分?
随机推荐
map去重代码实现
Domestic Google earth, terrain analysis seconds kill with the map software
TypeScript Brief (1)
8.Properties属性集合
接口性能测试方案设计方法有哪些?要怎么去写?
5.转换流
软件测试分析流程及输出项包括哪些内容?
Redis Basics
性能测试报告包括哪些内容?模板范文哪里找?看这里
白盒测试的概念、目的是什么?及主要方法有哪些?
WAVE SUMMIT 2022深度学习开发者峰会
seata处理分布式事务
Golang Protobuf 处理
4.泛型和工具类
MySQL lock
条件和递归
软件测试的流程规范有哪些?具体要怎么做?
银联最新测试工程师笔试题目,你能得多少分?
RPC服务远程漏洞
秒拍app分析