Skip to content

Commit 5851401

Browse files
committed
Initial commit
0 parents  commit 5851401

25 files changed

+670
-0
lines changed

README.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Go Pointer
2+
3+
在golang中基本类型因为没有包装类型,所以很多库都倾向于采用基本类型变量的指针来区分是没有传递还是传递了零值。
4+
5+
一个具体的例子,当不使用指针的时候,在执行任务的时候有个配置项:
6+
7+
```go
8+
package main
9+
10+
type Config struct {
11+
Foo int
12+
}
13+
14+
```
15+
16+
当Foo的值为0的时候我们不知道是传递了零值还是没有传递值,因为有些地方是要比较细的区分这些情况的,这个时候一些库就倾向于采用指针类型:
17+
18+
```go
19+
package main
20+
21+
type Config struct {
22+
Foo *int
23+
}
24+
25+
```
26+
27+
但是有时候这个值就是一个字面值常量传进去的,这个时候如果要获取指针类型的话就有点麻烦,上面这个场景只是举了一个例子,这个模块就是用来解决类似的问题的。
28+
29+
目前支持的数据类型:
30+
31+
```text
32+
bool
33+
byte
34+
complex64
35+
complex128
36+
float32
37+
float64
38+
int
39+
int8
40+
int16
41+
int32
42+
int64
43+
rune
44+
string
45+
time.Duration
46+
time.Time
47+
uint
48+
uint8
49+
uint16
50+
uint32
51+
uint64
52+
```
53+
54+
# string
55+
56+
# int
57+
58+
# float32
59+
60+
# float64
61+
62+
# bool
63+
64+
```go
65+
66+
```
67+
68+
# byte
69+
70+
#
71+
72+
73+

example/bool_example.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package example
2+
3+
import (
4+
"fmt"
5+
"go-pointer/pkg/pointer"
6+
)
7+
8+
func BoolExample() {
9+
10+
// 获取一个布尔指针,其值为true
11+
boolPointer := pointer.TruePointer()
12+
fmt.Println(*boolPointer)
13+
14+
// 获取一个布尔指针,其值为false
15+
boolPointer = pointer.FalsePointer()
16+
fmt.Println(*boolPointer)
17+
18+
19+
20+
}

example/example_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package example
2+
3+
import "testing"
4+
5+
func Test(t *testing.T) {
6+
7+
BoolExample()
8+
9+
}

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module go-pointer
2+
3+
go 1.18

pkg/pointer/bool.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package pointer
2+
3+
// TruePointer 返回一个布尔指针,其值为true
4+
func TruePointer() *bool {
5+
b := true
6+
return &b
7+
}
8+
9+
// FalsePointer 返回一个布尔指针,其值为false
10+
func FalsePointer() *bool {
11+
b := false
12+
return &b
13+
}
14+
15+
// ToBoolPointer 将布尔变量转换为布尔指针
16+
func ToBoolPointer(boolValue bool) *bool {
17+
return &boolValue
18+
}
19+
20+
// ToBoolPointerOrNilIfFalse 将布尔变量转换为布尔类型的指针,如果变量的值为false的话则转换为nil指针
21+
func ToBoolPointerOrNilIfFalse(boolValue bool) *bool {
22+
if boolValue {
23+
return &boolValue
24+
}
25+
return nil
26+
}
27+
28+
// FromBoolPointer 获取布尔指针实际指向的值,如果指针为nil的话则返回false
29+
func FromBoolPointer(boolPointer *bool) bool {
30+
return FromBoolPointerOrDefault(boolPointer, false)
31+
}
32+
33+
// FromBoolPointerOrDefault 获取布尔指针实际指向的值,如果指针为nil的话则返回defaultValue
34+
func FromBoolPointerOrDefault(boolPointer *bool, defaultValue bool) bool {
35+
if boolPointer == nil {
36+
return defaultValue
37+
} else {
38+
return *boolPointer
39+
}
40+
}

pkg/pointer/byte.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package pointer
2+
3+
// ToBytePointer 将byte类型的变量转换为对应的*byte指针类型
4+
func ToBytePointer(v byte) *byte {
5+
return &v
6+
}
7+
8+
// ToBytePointerOrNilIfZero 将byte类型的变量转换为对应的*byte指针类型,如果变量的值为0的话则返回nil指针
9+
func ToBytePointerOrNilIfZero(v byte) *byte {
10+
if v == 0 {
11+
return nil
12+
}
13+
return &v
14+
}
15+
16+
// FromBytePointer 获取*byte类型的指针的实际值,如果指针为nil的话则返回0
17+
func FromBytePointer(p *byte) byte {
18+
return FromBytePointerOrDefaultIfNil(p, 0)
19+
}
20+
21+
// FromBytePointerOrDefaultIfNil 获取*byte类型的指针的实际值,如果指针为nil的话则返回defaultValue
22+
func FromBytePointerOrDefaultIfNil(v *byte, defaultValue byte) byte {
23+
if v == nil {
24+
return defaultValue
25+
}
26+
return *v
27+
}

pkg/pointer/complex128.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package pointer
2+
3+
// ToComplex128Pointer 将complex128类型的变量转换为对应的*complex128指针类型
4+
func ToComplex128Pointer(v complex128) *complex128 {
5+
return &v
6+
}
7+
8+
// ToComplex128PointerOrNilIfZero 将complex128类型的变量转换为对应的*complex128指针类型,如果变量的值为0的话则返回nil指针
9+
func ToComplex128PointerOrNilIfZero(v complex128) *complex128 {
10+
if v == 0 {
11+
return nil
12+
}
13+
return &v
14+
}
15+
16+
// FromComplex128Pointer 获取*complex128类型的指针的实际值,如果指针为nil的话则返回0
17+
func FromComplex128Pointer(p *complex128) complex128 {
18+
return FromComplex128PointerOrDefaultIfNil(p, 0)
19+
}
20+
21+
// FromComplex128PointerOrDefaultIfNil 获取*complex128类型的指针的实际值,如果指针为nil的话则返回defaultValue
22+
func FromComplex128PointerOrDefaultIfNil(v *complex128, defaultValue complex128) complex128 {
23+
if v == nil {
24+
return defaultValue
25+
}
26+
return *v
27+
}

pkg/pointer/complex64.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package pointer
2+
3+
// ToComplex64Pointer 将complex64类型的变量转换为对应的*complex64指针类型
4+
func ToComplex64Pointer(v complex64) *complex64 {
5+
return &v
6+
}
7+
8+
// ToComplex64PointerOrNilIfZero 将complex64类型的变量转换为对应的*complex64指针类型,如果变量的值为0的话则返回nil指针
9+
func ToComplex64PointerOrNilIfZero(v complex64) *complex64 {
10+
if v == 0 {
11+
return nil
12+
}
13+
return &v
14+
}
15+
16+
// FromComplex64Pointer 获取*complex64类型的指针的实际值,如果指针为nil的话则返回0
17+
func FromComplex64Pointer(p *complex64) complex64 {
18+
return FromComplex64PointerOrDefaultIfNil(p, 0)
19+
}
20+
21+
// FromComplex64PointerOrDefaultIfNil 获取*complex64类型的指针的实际值,如果指针为nil的话则返回defaultValue
22+
func FromComplex64PointerOrDefaultIfNil(v *complex64, defaultValue complex64) complex64 {
23+
if v == nil {
24+
return defaultValue
25+
}
26+
return *v
27+
}

pkg/pointer/float32.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package pointer
2+
3+
4+
// ToFloat32Pointer 将float32类型的变量转换为对应的*float32指针类型
5+
func ToFloat32Pointer(v float32) *float32 {
6+
return &v
7+
}
8+
9+
// ToFloat32PointerOrNilIfZero 将float32类型的变量转换为对应的*float32指针类型,如果变量的值为0的话则返回nil指针
10+
func ToFloat32PointerOrNilIfZero(v float32) *float32 {
11+
if v < 0.0000001 {
12+
return nil
13+
}
14+
return &v
15+
}
16+
17+
// FromFloat32Pointer 获取*float32类型的指针的实际值,如果指针为nil的话则返回0
18+
func FromFloat32Pointer(p *float32) float32 {
19+
return FromFloat32PointerOrDefaultIfNil(p, 0)
20+
}
21+
22+
// FromFloat32PointerOrDefaultIfNil 获取*float32类型的指针的实际值,如果指针为nil的话则返回defaultValue
23+
func FromFloat32PointerOrDefaultIfNil(v *float32, defaultValue float32) float32 {
24+
if v == nil {
25+
return defaultValue
26+
}
27+
return *v
28+
}

pkg/pointer/float64.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package pointer
2+
3+
// ToFloat64Pointer 将float64类型的变量转换为对应的*float64指针类型
4+
func ToFloat64Pointer(v float64) *float64 {
5+
return &v
6+
}
7+
8+
// ToFloat64PointerOrNilIfZero 将float64类型的变量转换为对应的*float64指针类型,如果变量的值为0的话则返回nil指针
9+
func ToFloat64PointerOrNilIfZero(v float64) *float64 {
10+
if v < 0.0000001 {
11+
return nil
12+
}
13+
return &v
14+
}
15+
16+
// FromFloat64Pointer 获取*float64类型的指针的实际值,如果指针为nil的话则返回0
17+
func FromFloat64Pointer(p *float64) float64 {
18+
return FromFloat64PointerOrDefaultIfNil(p, 0)
19+
}
20+
21+
// FromFloat64PointerOrDefaultIfNil 获取*float64类型的指针的实际值,如果指针为nil的话则返回defaultValue
22+
func FromFloat64PointerOrDefaultIfNil(v *float64, defaultValue float64) float64 {
23+
if v == nil {
24+
return defaultValue
25+
}
26+
return *v
27+
}

0 commit comments

Comments
 (0)