diff --git a/README.md b/README.md
index 3f23fcf..0ed1bc0 100644
--- a/README.md
+++ b/README.md
@@ -162,7 +162,7 @@ import "github.com/duke-git/lancet/v2/condition"
[[play](https://go.dev/play/p/W1SSUmt6pvr)]
- **Or** : returns false if neither a nor b is truthy.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/condition.md#Or)]
- [[play](https://go.dev/play/p/UlQTxHaeEkq)]]
+[[play](https://go.dev/play/p/UlQTxHaeEkq)]]
- **Xor** : returns true if a or b but not both is truthy.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/condition.md#Xor)]
[[play](https://go.dev/play/p/gObZrW7ZbG8)]
@@ -340,8 +340,6 @@ import "github.com/duke-git/lancet/v2/cryptor"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/cryptor.md#RsaDecrypt)]
[[play](https://go.dev/play/p/uef0q1fz53I)]
-
-
### 6. Datetime package supports date and time format and compare.
```go
@@ -413,8 +411,6 @@ import hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
- **Hashmap** : hash map structure.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/datastructure/hashmap.md)]
-
-
### 8. Fileutil package implements some basic functions for file operations.
```go
@@ -514,8 +510,6 @@ import "github.com/duke-git/lancet/v2/function"
- **Watcher** : Watcher is used for record code excution time. can start/stop/reset the watch timer. get the elapsed time of function execution.
[[doc](https://github.com/duke-git/lancet/blob/main/docs/function.md#Watcher)]
-
-
### 11. Maputil package includes some functions to manipulate map.
```go
@@ -601,26 +595,62 @@ import "github.com/duke-git/lancet/v2/netutil"
#### Function list:
-- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString)
-- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#EncodeUrl)
-- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp)
-- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
-- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
-- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo)
-- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetRequestPublicIp)
-- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP)
-- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsInternalIP)
-- [HttpRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpRequest)
-- [HttpClient](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpClient)
-- [SendRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#SendRequest)
-- [DecodeResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#DecodeResponse)
-- [StructToUrlValues](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#StructToUrlValues)
-- [HttpGetdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet)
-- [HttpDeletedeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete)
-- [HttpPostdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost)
-- [HttpPutdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPut)
-- [HttpPatchdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPatch)
-- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ParseHttpResponse)
+- **ConvertMapToQueryString** : convert map to sorted url query string.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ConvertMapToQueryString)]
+ [[play](https://go.dev/play/p/jnNt_qoSnRi)]
+- **EncodeUrl** : encode url(?a=1&b=[2] -> ?a=1&b=%5B2%5D).
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#EncodeUrl)]
+ [[play](https://go.dev/play/p/bsZ6BRC4uKI)]
+- **GetInternalIp** : return internal ipv4.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetInternalIp)]
+ [[play](https://go.dev/play/p/5mbu-gFp7ei)]
+- **GetIps** : return all ipv4 of current system.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)]
+ [[play](https://go.dev/play/p/NUFfcEmukx1)]
+- **GetMacAddrs** : return mac address of current system.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)]
+ [[play](https://go.dev/play/p/Rq9UUBS_Xp1)]
+- **GetPublicIpInfo** : return [public ip information](http://ip-api.com/json/).
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetPublicIpInfo)]
+ [[play](https://go.dev/play/p/YDxIfozsRHR)]
+- **GetRequestPublicIp** : return the http request public ip.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetRequestPublicIp)]
+ [[play](https://go.dev/play/p/kxU-YDc_eBo)]
+- **IsPublicIP** : verify a ip is public or not.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsPublicIP)]
+ [[play](https://go.dev/play/p/nmktSQpJZnn)]
+- **IsInternalIP** : verify an ip is intranet or not.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#IsInternalIP)]
+ [[play](https://go.dev/play/p/sYGhXbgO4Cb)]
+- **HttpRequest** : a composed http request used for HttpClient send request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpRequest)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **HttpClient** : a http client tool, used for sending http request
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpClient)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **SendRequest** : send http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#SendRequest)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **DecodeResponse** : decode http response into target object.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#DecodeResponse)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **StructToUrlValues** : convert struct to url valuse.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#StructToUrlValues)]
+ [[play](https://go.dev/play/p/pFqMkM40w9z)]
+- **HttpGetdeprecated** : send get http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpGet)]
+- **HttpDeletedeprecated** : send delete http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpDelete)]
+- **HttpPostdeprecated** : send post http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPost)]
+- **HttpPutdeprecated** : send put http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPut)]
+- **HttpPatchdeprecated** : send patch http request.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#HttpPatch)]
+- **ParseHttpResponse** : decode http response into target object.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#ParseHttpResponse)]
+
+
### 14. Random package implements some basic functions to generate random int and string.
@@ -679,8 +709,6 @@ import "github.com/duke-git/lancet/v2/retry"
[[doc](https://github.com/duke-git/lancet/blob/main/docs/retry.md#RetryTimes)]
[[play](https://go.dev/play/p/ssfVeU2SwLO)]
-
-
### 16. Slice contains some functions to manipulate slice.
```go
diff --git a/README_zh-CN.md b/README_zh-CN.md
index 7807a81..a8f0ca9 100644
--- a/README_zh-CN.md
+++ b/README_zh-CN.md
@@ -600,26 +600,63 @@ import "github.com/duke-git/lancet/v2/netutil"
#### 函数列表:
-- [ConvertMapToQueryString](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString)
-- [GetInternalIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp)
-- [EncodeUrl](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl)
-- [GetIps](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetIps)
-- [GetMacAddrs](https://github.com/duke-git/lancet/blob/main/docs/netutil.md#GetMacAddrs)
-- [GetPublicIpInfo](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo)
-- [GetRequestPublicIp](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetRequestPublicIp)
-- [IsPublicIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP)
-- [IsInternalIP](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP)
-- [HttpRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpRequest)
-- [HttpClient](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpClient)
-- [SendRequest](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#SendRequest)
-- [DecodeResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#DecodeResponse)
-- [StructToUrlValues](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#StructToUrlValues)
-- [HttpGetdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet)
-- [HttpDeletedeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete)
-- [HttpPostdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost)
-- [HttpPutdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPut)
-- [HttpPatchdeprecated](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPatch)
-- [ParseHttpResponse](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ParseHttpResponse)
+- **ConvertMapToQueryString** : 将map转换成http查询字符串。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ConvertMapToQueryString)]
+ [[play](https://go.dev/play/p/jnNt_qoSnRi)]
+- **EncodeUrl** : 编码url query string的值(?a=1&b=[2] -> ?a=1&b=%5B2%5D)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#EncodeUrl)]
+ [[play](https://go.dev/play/p/bsZ6BRC4uKI)]
+- **GetInternalIp** : 获取内部ipv4。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetInternalIp)]
+ [[play](https://go.dev/play/p/5mbu-gFp7ei)]
+- **GetIps** : 获取系统ipv4地址列表。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetIps)]
+ [[play](https://go.dev/play/p/NUFfcEmukx1)]
+- **GetMacAddrs** : 获取系统mac地址列。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetMacAddrs)]
+ [[play](https://go.dev/play/p/Rq9UUBS_Xp1)]
+- **GetPublicIpInfo** : 获取[公网ip信息](http://ip-api.com/json/).
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetPublicIpInfo)]
+ [[play](https://go.dev/play/p/YDxIfozsRHR)]
+- **GetRequestPublicIp** : 获取http请求ip。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#GetRequestPublicIp)]
+ [[play](https://go.dev/play/p/kxU-YDc_eBo)]
+- **IsPublicIP** : 判断ip是否是公共ip。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsPublicIP)]
+ [[play](https://go.dev/play/p/nmktSQpJZnn)]
+- **IsInternalIP** : 判断ip是否是局域网ip。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#IsInternalIP)]
+ [[play](https://go.dev/play/p/sYGhXbgO4Cb)]
+- **HttpRequest** : 用于抽象HTTP请求实体的结构。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpRequest)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **HttpClient** : 用于发送HTTP请求。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpClient)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **SendRequest** : 发送http请求。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#SendRequest)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **DecodeResponse** : 解析http响应体到目标结构体。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#DecodeResponse)]
+ [[play](https://go.dev/play/p/jUSgynekH7G)]
+- **StructToUrlValues** : 将结构体转为url values, 仅转化结构体导出字段并且包含`json` tag。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#StructToUrlValues)]
+ [[play](https://go.dev/play/p/pFqMkM40w9z)]
+- **HttpGetdeprecated** : 发送http get请求(已弃用:SendRequest代替)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpGet)]
+- **HttpDeletedeprecated** : 发送http delete请求(已弃用:SendRequest代替)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpDelete)]
+- **HttpPostdeprecated** : 发送http post请求(已弃用:SendRequest代替)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPost)]
+- **HttpPutdeprecated** : 发送http put请求(已弃用:SendRequest代替)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPut)]
+- **HttpPatchdeprecated** : 发送http patch请求(已弃用:SendRequest代替)。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#HttpPatch)]
+- **ParseHttpResponse** : 解析http响应体到目标结构体。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/netutil_zh-CN.md#ParseHttpResponse)]
+
+
+
### 14. random 随机数生成器包,可以生成随机[]bytes, int, string。
diff --git a/netutil/http.go b/netutil/http.go
index a6484cc..1db8f8c 100644
--- a/netutil/http.go
+++ b/netutil/http.go
@@ -21,32 +21,32 @@ import (
"strings"
)
-//HttpGet send get http request
+// HttpGet send get http request.
func HttpGet(url string, params ...any) (*http.Response, error) {
return doHttpRequest(http.MethodGet, url, params...)
}
-//HttpPost send post http request
+// HttpPost send post http request.
func HttpPost(url string, params ...any) (*http.Response, error) {
return doHttpRequest(http.MethodPost, url, params...)
}
-//HttpPut send put http request
+// HttpPut send put http request.
func HttpPut(url string, params ...any) (*http.Response, error) {
return doHttpRequest(http.MethodPut, url, params...)
}
-//HttpDelete send delete http request
+// HttpDelete send delete http request.
func HttpDelete(url string, params ...any) (*http.Response, error) {
return doHttpRequest(http.MethodDelete, url, params...)
}
-// HttpPatch send patch http request
+// HttpPatch send patch http request.
func HttpPatch(url string, params ...any) (*http.Response, error) {
return doHttpRequest(http.MethodPatch, url, params...)
}
-// ParseHttpResponse decode http response to specified interface
+// ParseHttpResponse decode http response to specified interface.
func ParseHttpResponse(resp *http.Response, obj any) error {
if resp == nil {
return errors.New("InvalidResp")
@@ -55,7 +55,8 @@ func ParseHttpResponse(resp *http.Response, obj any) error {
return json.NewDecoder(resp.Body).Decode(obj)
}
-// ConvertMapToQueryString convert map to sorted url query string
+// ConvertMapToQueryString convert map to sorted url query string.
+// Play: https://go.dev/play/p/jnNt_qoSnRi
func ConvertMapToQueryString(param map[string]any) string {
if param == nil {
return ""
diff --git a/netutil/http_client.go b/netutil/http_client.go
index 25f14d8..44a1a3a 100644
--- a/netutil/http_client.go
+++ b/netutil/http_client.go
@@ -92,7 +92,8 @@ func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient {
return client
}
-// SendRequest send http request
+// SendRequest send http request.
+// Play: https://go.dev/play/p/jUSgynekH7G
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error) {
err := validateRequest(request)
if err != nil {
@@ -128,7 +129,8 @@ func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, err
return resp, nil
}
-// DecodeResponse decode response into target object
+// DecodeResponse decode response into target object.
+// Play: https://go.dev/play/p/jUSgynekH7G
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error {
if resp == nil {
return errors.New("invalid target param")
@@ -203,7 +205,8 @@ func validateRequest(req *HttpRequest) error {
}
// StructToUrlValues convert struct to url valuse,
-// only convert the field which is exported and has `json` tag
+// only convert the field which is exported and has `json` tag.
+// Play: https://go.dev/play/p/pFqMkM40w9z
func StructToUrlValues(targetStruct any) url.Values {
rv := reflect.ValueOf(targetStruct)
rt := reflect.TypeOf(targetStruct)
diff --git a/netutil/http_example_test.go b/netutil/http_example_test.go
new file mode 100644
index 0000000..71aeebe
--- /dev/null
+++ b/netutil/http_example_test.go
@@ -0,0 +1,99 @@
+package netutil
+
+import "fmt"
+
+func ExampleHttpClient_SendRequest() {
+ request := &HttpRequest{
+ RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+ Method: "GET",
+ }
+
+ httpClient := NewHttpClient()
+ resp, err := httpClient.SendRequest(request)
+ if err != nil || resp.StatusCode != 200 {
+ return
+ }
+
+ type Todo struct {
+ UserId int `json:"userId"`
+ Id int `json:"id"`
+ Title string `json:"title"`
+ Completed bool `json:"completed"`
+ }
+
+ var todo Todo
+ err = httpClient.DecodeResponse(resp, &todo)
+ if err != nil {
+ return
+ }
+
+ fmt.Println(todo.Id)
+
+ // Output:
+ // 1
+}
+
+func ExampleHttpClient_DecodeResponse() {
+ request := &HttpRequest{
+ RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+ Method: "GET",
+ }
+
+ httpClient := NewHttpClient()
+ resp, err := httpClient.SendRequest(request)
+ if err != nil || resp.StatusCode != 200 {
+ return
+ }
+
+ type Todo struct {
+ UserId int `json:"userId"`
+ Id int `json:"id"`
+ Title string `json:"title"`
+ Completed bool `json:"completed"`
+ }
+
+ var todo Todo
+ err = httpClient.DecodeResponse(resp, &todo)
+ if err != nil {
+ return
+ }
+
+ fmt.Println(todo.Id)
+
+ // Output:
+ // 1
+}
+
+func ExampleStructToUrlValues() {
+ type TodoQuery struct {
+ Id int `json:"id"`
+ Name string `json:"name"`
+ }
+ todoQuery := TodoQuery{
+ Id: 1,
+ Name: "Test",
+ }
+ todoValues := StructToUrlValues(todoQuery)
+
+ fmt.Println(todoValues.Get("id"))
+ fmt.Println(todoValues.Get("name"))
+
+ // Output:
+ // 1
+ // Test
+}
+
+func ExampleConvertMapToQueryString() {
+ var m = map[string]any{
+ "c": 3,
+ "a": 1,
+ "b": 2,
+ }
+
+ qs := ConvertMapToQueryString(m)
+
+ fmt.Println(qs)
+
+ // Output:
+ // a=1&b=2&c=3
+}
diff --git a/netutil/net.go b/netutil/net.go
index cb62aaf..ab4dab2 100644
--- a/netutil/net.go
+++ b/netutil/net.go
@@ -9,7 +9,8 @@ import (
"strings"
)
-// GetInternalIp return internal ipv4
+// GetInternalIp return internal ipv4.
+// Play: https://go.dev/play/p/5mbu-gFp7ei
func GetInternalIp() string {
addr, err := net.InterfaceAddrs()
if err != nil {
@@ -26,7 +27,8 @@ func GetInternalIp() string {
return ""
}
-// GetRequestPublicIp return the requested public ip
+// GetRequestPublicIp return the requested public ip.
+// Play: https://go.dev/play/p/kxU-YDc_eBo
func GetRequestPublicIp(req *http.Request) string {
var ip string
for _, ip = range strings.Split(req.Header.Get("X-Forwarded-For"), ",") {
@@ -47,7 +49,8 @@ func GetRequestPublicIp(req *http.Request) string {
}
// GetPublicIpInfo return public ip information
-// return the PublicIpInfo struct
+// return the PublicIpInfo struct.
+// Play: https://go.dev/play/p/YDxIfozsRHR
func GetPublicIpInfo() (*PublicIpInfo, error) {
resp, err := http.Get("http://ip-api.com/json/")
if err != nil {
@@ -69,7 +72,8 @@ func GetPublicIpInfo() (*PublicIpInfo, error) {
return &ip, nil
}
-// GetIps return all ipv4 of system
+// GetIps return all ipv4 of system.
+// Play: https://go.dev/play/p/NUFfcEmukx1
func GetIps() []string {
var ips []string
@@ -89,7 +93,8 @@ func GetIps() []string {
return ips
}
-// GetMacAddrs get mac address
+// GetMacAddrs get mac address.
+// Play: https://go.dev/play/p/Rq9UUBS_Xp1
func GetMacAddrs() []string {
var macAddrs []string
@@ -125,7 +130,8 @@ type PublicIpInfo struct {
Ip string `json:"query"`
}
-// IsPublicIP verify a ip is public or not
+// IsPublicIP verify a ip is public or not.
+// Play: https://go.dev/play/p/nmktSQpJZnn
func IsPublicIP(IP net.IP) bool {
if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {
return false
@@ -145,7 +151,8 @@ func IsPublicIP(IP net.IP) bool {
return false
}
-// IsInternalIP verify an ip is intranet or not
+// IsInternalIP verify an ip is intranet or not.
+// Play: https://go.dev/play/p/sYGhXbgO4Cb
func IsInternalIP(IP net.IP) bool {
if IP.IsLoopback() {
return true
@@ -159,7 +166,8 @@ func IsInternalIP(IP net.IP) bool {
return false
}
-// EncodeUrl encode url
+// EncodeUrl encode url.
+// Play: https://go.dev/play/p/bsZ6BRC4uKI
func EncodeUrl(urlStr string) (string, error) {
URL, err := url.Parse(urlStr)
if err != nil {
diff --git a/netutil/net_example_test.go b/netutil/net_example_test.go
new file mode 100644
index 0000000..a9d967c
--- /dev/null
+++ b/netutil/net_example_test.go
@@ -0,0 +1,91 @@
+package netutil
+
+import (
+ "fmt"
+ "net"
+ "net/http"
+)
+
+func ExampleGetInternalIp() {
+ internalIp := GetInternalIp()
+
+ result := IsInternalIP(net.ParseIP(internalIp))
+ fmt.Println(result)
+
+ // Output:
+ // true
+}
+
+func ExampleGetPublicIpInfo() {
+ ipInfo, err := GetPublicIpInfo()
+ if err != nil {
+ return
+ }
+
+ result := IsPublicIP(net.ParseIP(ipInfo.Ip))
+ fmt.Println(result)
+
+ // Output:
+ // true
+}
+
+func ExampleGetRequestPublicIp() {
+ ip := "36.112.24.10"
+
+ request := http.Request{
+ Method: "GET",
+ Header: http.Header{
+ "X-Forwarded-For": {ip},
+ },
+ }
+ publicIp := GetRequestPublicIp(&request)
+
+ fmt.Println(publicIp)
+
+ // Output:
+ // 36.112.24.10
+}
+
+func ExampleIsInternalIP() {
+ ip1 := IsInternalIP(net.ParseIP("127.0.0.1"))
+ ip2 := IsInternalIP(net.ParseIP("192.168.0.1"))
+ ip3 := IsInternalIP(net.ParseIP("36.112.24.10"))
+
+ fmt.Println(ip1)
+ fmt.Println(ip2)
+ fmt.Println(ip3)
+
+ // Output:
+ // true
+ // true
+ // false
+}
+
+func ExampleIsPublicIP() {
+ ip1 := IsPublicIP(net.ParseIP("127.0.0.1"))
+ ip2 := IsPublicIP(net.ParseIP("192.168.0.1"))
+ ip3 := IsPublicIP(net.ParseIP("36.112.24.10"))
+
+ fmt.Println(ip1)
+ fmt.Println(ip2)
+ fmt.Println(ip3)
+
+ // Output:
+ // false
+ // false
+ // true
+}
+
+func ExampleEncodeUrl() {
+ urlAddr := "http://www.lancet.com?a=1&b=[2]"
+
+ encodedUrl, err := EncodeUrl(urlAddr)
+ if err != nil {
+ return
+ }
+
+ fmt.Println(encodedUrl)
+
+ // Output:
+ // http://www.lancet.com?a=1&b=%5B2%5D
+}