概述
运算符就是简单的 & 和 * 一个取地址、一个解析地址。
package main
import(
"fmt"
)
func main(){
var i int // i 的类型是int型
i=1 // i 的值为 1;
var p *int // p 的类型是[int型的指针]
p=&i // p 的值为 [i的地址]
fmt.Printf("i=%d;p=%d;*p=%dn",i,p,*p)
*p=2 // *p 的值为 [[i的地址]的指针] (其实就是i嘛),这行代码也就等价于 i = 2
fmt.Printf("i=%d;p=%d;*p=%dn",i,p,*p)
i=3 // 验证想法
fmt.Printf("i=%d;p=%d;*p=%dn",i,p,*p)
}
这段代码执行结果:
i=1;p=0x4212f100;*p=1
i=2;p=0x4212f100;*p=2
i=3;p=0x4212f100;*p=3
函数的参数传递可以看下面例子:
package main
import "fmt"
type abc struct{
v int
}
func (a abc)aaaa(){ //传入的是值,而不是引用
a.v=1
fmt.Printf("1:%dn",a.v)
}
func (a *abc)bbbb(){ //传入的是引用,而不是值
fmt.Printf("2:%dn",a.v)
a.v=2
fmt.Printf("3:%dn",a.v)
}
func (a *abc)cccc(){ //传入的是引用,而不是值
fmt.Printf("4:%dn",a.v)
}
func main(){
aobj:=abc{} //new(abc);
aobj.aaaa()
aobj.bbbb()
aobj.cccc()
}
输出结果:
1:1
2:0
3:2
4:2
传值与传指针
当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在copy上。
传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。
Go语言中string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)
要访问指针 p 指向的结构体中某个元素 x,不需要显式地使用 * 运算,可以直接 p.x ;
package main
import "fmt"
type S map[string][]string
func Summary(paramstring)(s*S){
s=&S{
"name":[]string{param},
"profession":[]string{"Javaprogrammer","ProjectManager"},
"interest(lang)":[]string{"Clojure","Python","Go"},
"focus(project)":[]string{"UE","AgileMethodology","SoftwareEngineering"},
"hobby(life)":[]string{"Basketball","Movies","Travel"},
}
return s
}
func main(){
s:=Summary("Harry")
fmt.Printf("Summary(address):%vrn",s)
fmt.Printf("Summary(content):%vrn",*s)
}
输出:
Summary(address): 0x42131100
Summary(content): map[profession:[Java programmer Project Manager] interest(lang):[Clojure Python Go] hobby(life):[Basketball Movies Travel] name:[Harry] focus(project):[UE Agile Methodology Software Engineering]]
exit code 0, process exited normally.
游戏中的结构定义:
// 房间结构
type RoomData struct {
RoomID string // 房间ID
Data *bacall.EntryGame // 结构
}
// 玩家结构
type PlayerST struct {
MyAreaData []*ChipInST // 索引是位置
}
// 押注结构
type ChipInST struct {
MapData map[int]*SaveData // key:金币类型
}
// 押注金币的数量结构
type SaveData struct {
ICoinNum int // 金币的数量
}
// 筹码
var (
Lo = []int{10,20,30,50,100,200}
Cj = []int{20,30,50,100,200,300}
ZJ = []int{100,200,300,500,1000,2000}
GJ = []int{200,300,5000,1000,2000,3000}
)
var (
GRoom map[int]*RoomData
GPlayer map[string]*PlayerST
GPlayerBefore map[string]*PlayerST
GPlayerBeforeOne map[string]int
GPlayerBeforePos map[string]int
GHistory map[int][]*bacall.HistoryData
GPlayerOpenID map[string]int
ConnBS *websocket.Conn
)
函数使用:
func HandleCltProtocol2BS(conn *websocket.Conn, protocol2 interface{}, protocolData map[string]interface{}) {
defer func() {
if err := recover(); err != nil {
glog.Errorln(fmt.Sprintf("ERROR:[%s]nSTACK:[%sn]", err, string(debug.Stack())))
}
}()
switch protocol2 {
case float64(ball.C2SEntryGameProto2):
C2SEntryGameProto2Func(conn,protocolData)
case float64(ball.C2SGetHistoryDataProto2):
C2SGetHistoryDataProto2Func(conn,protocolData)
case float64(ball.C2SUserChipInProto2):
C2SUserChipInProto2Func(conn,protocolData)
case float64(ball.C2SUserGetItemRateProto2):
C2SUserGetItemRateProto2Func(conn,protocolData)
case float64(ball.C2SUserGetGameStateProto2):
C2SUserGetGameStateProto2Func(conn,protocolData)
default:
fmt.Println("协议错误")
}
return
}
参考资料:
go语言指针
https://www.cnblogs.com/ghj1976/archive/2013/02/28/2936595.html
LollipopGo_Server_Client框架
https://github.com/Golangltd/LollipopGo_Server_Client
Golang语言情怀
ID:wwwGolangLtd
www.Golang.Ltd
游戏服务器架构丨分布式技术丨大数据丨Go语言学习
最后
以上就是还单身白云为你收集整理的语言里的指针中的值_Golang语言情怀第9期 Go 语言指针的全部内容,希望文章能够帮你解决语言里的指针中的值_Golang语言情怀第9期 Go 语言指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复