From 2f6ee844436416d65440fd474a900c5c1f9a8bf9 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 2 Jun 2023 11:48:17 +0800 Subject: [PATCH] feat: add Of and Unwrap --- pointer/pointer.go | 17 ++++++++++++ pointer/pointer_examples_test.go | 44 ++++++++++++++++++++++++++++++++ pointer/pointer_test.go | 24 +++++++++++++++-- 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 pointer/pointer_examples_test.go diff --git a/pointer/pointer.go b/pointer/pointer.go index 365d048..e28f734 100644 --- a/pointer/pointer.go +++ b/pointer/pointer.go @@ -1,8 +1,25 @@ +// Copyright 2023 dudaodong@gmail.com. All rights reserved. +// Use of this source code is governed by MIT license. + +// Package pointer contains some util functions to operate go pointer. package pointer import "reflect" +// Of returns a pointer to the value `v`. +// Play: todo +func Of[T any](v T) *T { + return &v +} + +// Unwrap returns the value from the pointer. +// Play: todo +func Unwrap[T any](p *T) T { + return *p +} + // ExtractPointer returns the underlying value by the given interface type +// Play: todo func ExtractPointer(value any) any { t := reflect.TypeOf(value) v := reflect.ValueOf(value) diff --git a/pointer/pointer_examples_test.go b/pointer/pointer_examples_test.go new file mode 100644 index 0000000..a4ce554 --- /dev/null +++ b/pointer/pointer_examples_test.go @@ -0,0 +1,44 @@ +package pointer + +import "fmt" + +func ExampleOf() { + result1 := Of(123) + result2 := Of("abc") + + fmt.Println(*result1) + fmt.Println(*result2) + + // Output: + // 123 + // abc +} + +func ExampleUnwrap() { + a := 123 + b := "abc" + + result1 := Unwrap(&a) + result2 := Unwrap(&b) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 123 + // abc +} + +func ExampleExtractPointer() { + a := 1 + b := &a + c := &b + d := &c + + result := ExtractPointer(d) + + fmt.Println(result) + + // Output: + // 1 +} diff --git a/pointer/pointer_test.go b/pointer/pointer_test.go index c003703..df72172 100644 --- a/pointer/pointer_test.go +++ b/pointer/pointer_test.go @@ -1,12 +1,32 @@ package pointer import ( - "github.com/duke-git/lancet/v2/internal" "testing" + + "github.com/duke-git/lancet/v2/internal" ) -func TestExtractPointer(t *testing.T) { +func TestOf(t *testing.T) { + assert := internal.NewAssert(t, "TestOf") + result1 := Of(123) + result2 := Of("abc") + + assert.Equal(123, *result1) + assert.Equal("abc", *result2) +} + +func TestUnwrap(t *testing.T) { + assert := internal.NewAssert(t, "TestUnwrap") + + a := 123 + b := "abc" + + assert.Equal(a, Unwrap(&a)) + assert.Equal(b, Unwrap(&b)) +} + +func TestExtractPointer(t *testing.T) { assert := internal.NewAssert(t, "TestExtractPointer") a := 1