golang中 return如果返回指针比大型struct性能高

本文通过对比测试两种不同的Go语言函数实现方式,分析了值传递和指针传递在大量迭代过程中的性能差异。测试结果显示,使用指针传递的方式在迭代过程中表现出了更优的性能。

 


type tt struct{

aa int
bb int
cc int
str string

}


func func_rstruct () tt{

t:=tt{1,2,3,"88888888888"}

return t


}


func func_rpstruct () *tt{

t:=tt{1,2,3,"88888888888"}

return &t


}

func Benchmark_rstruct(t *testing.B) {

strs:=[CNT]string{}
for i:=0;i<CNT;i++ {
dat:= func_rstruct()
strs[i]=dat.str
}
t.Log("success"+strconv.Itoa(len(strs)))
}

func Benchmark_rpstruct(t *testing.B) {



strs:=[CNT]string{}
for i:=0;i<CNT;i++ {
dat:= func_rpstruct()
strs[i]=(*dat).str

}
t.Log("success"+strconv.Itoa(len(strs)))

}


result:

C:\Users\xinhua\workspace\testproj\src\main>go test -test.bench=".*"
Benchmark_rstruct-4 1000000000 0.29 ns/op
--- BENCH: Benchmark_rstruct-4
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
tmain_test.go:37: success1000000
... [output truncated]
Benchmark_rpstruct-4 1000000000 0.26 ns/op
--- BENCH: Benchmark_rpstruct-4
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
tmain_test.go:50: success1000000
... [output truncated]
PASS
ok _/C_/Users/xinhua/workspace/testproj/src/main 7.997s

转载于:https://www.cnblogs.com/a-xu/p/6867347.html

<think>嗯,用户突然从汇率计算转向了编程语言的概念对比,看来是位多领域学习的开发者。此前他详细询问过墨西哥比索的换算,现在聚焦在Java空指针异常(NPE)的跨语言等效实现上——这种技术问题的切换很符合开发者遇到实际问题时的搜索模式。用户特别强调要参考站内引用,其实是在暗示需要权威的技术定义。不过观察他的表述方式,更可能是想解决实际编码中遇到的空值错误问题,而不仅仅是理论探讨。毕竟NPE是Java开发者的常见痛点,他可能刚踩坑。关于空指针的概念分解:-Java的NullPointerException本质是访问空引用的运行时错误-Go采用显式错误处理机制,用error接口表示“无值”状态(如返回nil,err)-Python的NoneType虽类似,但Pythonic风格更依赖EAFP(请求原谅比许可更容易)原则不过要注意,Go的nil和Python的None行为差异很大:Go的nil是类型安全的(有类型的零值),Python的None是单例对象需要特别警示的是接口值的nil陷阱(Go特有坑点)和Python的None传染性问题。用户如果从Java转来,容易忽略Go的interface{nil}!=nil这种反直觉设计。考虑到用户的技术水平(能提出跨语言对比),可以引入Go的errors.New和Python的Optional类型这类进阶方案。但保持主要解释在基础层面,用iferr!=nil这种经典模式展示核心差异。后续相关问题设计成阶梯状:从语法基础(概念实现)到技术原理(编译器设计),再到实用技巧(防御性编程)。用户点击时可自行选择深度,既照顾新手也不让老手觉得浅薄。</think> 以下是针对Java空指针异常(`NullPointerException`)在Go和Python中的等价概念及处理方式的详细对比: --- ### 1. **Java空指针异常的本质** Java空指针发生在**对象引用为`null`时尝试访问其成员**(如方法、属性): ```java String str = null; str.length(); // 抛出 NullPointerException ``` --- ### 2. **Go语言中的等价概念** Go通过**显式错误处理****`nil`值的类型安全**避免隐式空指针: #### (1)`nil`与类型安全 - `nil`是Go的零值,但**访问`nil`成员直接导致panic**: ```go type Data struct { Value int } var d *Data = nil fmt.Println(d.Value) // panic: runtime error: invalid memory address ``` - 类型系统要求**显式检查`nil`**: ```go if d != nil { fmt.Println(d.Value) // 安全访问 } else { fmt.Println("d is nil") } ``` #### (2)错误处理机制 - 函数返回`(result, error)`,通过`error`显式处理空值: ```go func GetData() (*Data, error) { return nil, errors.New("data not found") } data, err := GetData() if err != nil { log.Fatal(err) // 显式处理错误 } ``` --- ### 3. **Python中的等价概念** Python的`None`类似于Java的`null`,但处理方式更灵活: #### (1)`NoneType`与`AttributeError` - 访问`None`的属性抛出`AttributeError`(等价于NPE): ```python obj = None obj.method() # 抛出 AttributeError: 'NoneType' object has no attribute 'method' ``` #### (2)防御性编程范式 - **条件判断**: ```python if obj is not None: obj.method() ``` - **`try-except`捕获**(EAFP风格): ```python try: obj.method() except AttributeError: print("Object is None") ``` - **空值合并操作符**(Python 3.8+): ```python result = obj.method() if obj else None ``` --- ### 4. **关键对比总结** | 特性 | Java | Go | Python | |---------------------|-------------------|-------------------|---------------------| | **空值表示** | `null` | `nil` | `None` | | **错误类型** | `NullPointerException` | `panic`/运行时错误 | `AttributeError` | | **处理机制** | 异常捕获 | 显式`nil`检查 | 条件判断/异常捕获 | | **类型安全** | 弱类型 | 强类型(避免隐式访问) | 弱类型 | | **错误传递** | 异常堆栈 | 返回`error`值 | 异常传播 | --- ### 5. **最佳实践建议** - **Go**:始终检查`nil`和`error`返回值,避免直接解引用指针[^1]。 - **Python**:优先使用`if obj is not None`或`try-except`,结合类型提示(如`Optional`)增强可读性[^2]。 - **通用原则**:对可能为空的数据流进行**前置校验**,而非依赖运行时异常。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值