最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang切片連接成字符串的實(shí)現(xiàn)示例

 更新時(shí)間:2023年11月09日 09:55:38   作者:戀喵大鯉魚  
本文主要介紹了Golang切片連接成字符串的實(shí)現(xiàn)示例,可以使用Go語言中的內(nèi)置函數(shù)"String()"可以將字節(jié)切片轉(zhuǎn)換為字符串,具有一定的參考價(jià)值,感興趣的可以了解一下

1.問題

如何將一個(gè)切片連接成一個(gè)字符串呢?

您最先想到的可能是標(biāo)準(zhǔn)庫(kù) strings 包的 Join 函數(shù)。

func Join(elems []string, sep string) string

Join 將字符串切片的所有元素連接成一個(gè)字符串,各個(gè)元素間使用給定的字符串分隔。

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := []string{"foo", "bar", "baz"}
	fmt.Println(strings.Join(s, ", "))
}

運(yùn)行輸出:

foo, bar, baz

strings.Join 只能將字符串切片連接成字符串,但對(duì)于其他類型的切片呢?

事實(shí)上,標(biāo)準(zhǔn)庫(kù)并沒有針對(duì)每種類型的切片都給出一個(gè)實(shí)現(xiàn),也沒有使用反射給出一個(gè)通用的實(shí)現(xiàn)。既然沒有那我們自己來實(shí)現(xiàn)一個(gè)吧。

2.使用反射實(shí)現(xiàn)

如果想要將任意類型的切片連接成字符串,可以使用反射(reflect)包來動(dòng)態(tài)處理不同類型的切片,將元素轉(zhuǎn)換為字符串,并連接成一個(gè)字符串。

// JoinE concatenates all elements of Array, Slice or String to a single string with a separator
// and returns an error if an error occurred.
// E.g. input []int{1, 2, 3} and separator ",", output is a string "1,2,3".
// It panics if a's Kind is not Array, Slice, or String.
func JoinE(a any, sep string) (string, error) {
	v := reflect.ValueOf(a)
	if v.Kind() == reflect.String {
		return JoinE(strings.Split(a.(string), ""), sep)
	}
	var s string
	for i := 0; i < v.Len(); i++ {
		if len(s) > 0 {
			s += sep
		}
		str, err := conv.ToStringE(v.Index(i).Interface())
		if err != nil {
			return "", err
		}
		s += str
	}
	return s, nil
}

其中 ToStringE 是將任意類型轉(zhuǎn)為字符串。

// ToStringE casts any type to a string type.
func ToStringE(i any) (string, error) {
	i = indirectToStringerOrError(i)

	switch s := i.(type) {
	case string:
		return s, nil
	case bool:
		return strconv.FormatBool(s), nil
	case int:
		return strconv.Itoa(s), nil
	case int64:
		return strconv.FormatInt(s, 10), nil
	case int32:
		return strconv.Itoa(int(s)), nil
	case int16:
		return strconv.FormatInt(int64(s), 10), nil
	case int8:
		return strconv.FormatInt(int64(s), 10), nil
	case uint:
		return strconv.FormatUint(uint64(s), 10), nil
	case uint64:
		return strconv.FormatUint(uint64(s), 10), nil
	case uint32:
		return strconv.FormatUint(uint64(s), 10), nil
	case uint16:
		return strconv.FormatUint(uint64(s), 10), nil
	case uint8:
		return strconv.FormatUint(uint64(s), 10), nil
	case float64:
		return strconv.FormatFloat(s, 'f', -1, 64), nil
	case float32:
		return strconv.FormatFloat(float64(s), 'f', -1, 32), nil
	case json.Number:
		return s.String(), nil
	case []byte:
		return string(s), nil
	case template.HTML:
		return string(s), nil
	case template.HTMLAttr:
		return string(s), nil
	case template.URL:
		return string(s), nil
	case template.JS:
		return string(s), nil
	case template.JSStr:
		return string(s), nil
	case template.CSS:
		return string(s), nil
	case template.Srcset:
		return string(s), nil
	case nil:
		return "", nil
	case fmt.Stringer:
		return s.String(), nil
	case error:
		return s.Error(), nil
	default:
		return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i)
	}
}

// Copied from html/template/content.go.
// indirectToStringerOrError returns the value, after dereferencing as many times
// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer
// or error.
func indirectToStringerOrError(a any) any {
	if a == nil {
		return nil
	}
	v := reflect.ValueOf(a)
	for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Pointer && !v.IsNil() {
		v = v.Elem()
	}
	return v.Interface()
}

如果不關(guān)心錯(cuò)誤,可以再封裝一下。

// Join concatenates all elements of Array, Slice or String to a single string with a separator.
func Join(a any, sep string) string {
	s, _ := JoinE(a, sep)
	return s
}

我們使用不同類型的切片來驗(yàn)證一下。

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := []string{"foo", "bar", "baz"}
	fmt.Println(Join(s, ", "))
	
	i := []int{1, 2, 3}
	fmt.Println(Join(i, ", "))

	f := []float64{1.1, 2.2, 3.3}
	fmt.Println(Join(f, ", "))
	
	b := []bool{true, false, true}
	fmt.Println(Join(b, ", "))

	// 可以將字符串看成字符切片。
	str := "foo"
	fmt.Println(Join(str, ", "))
}

運(yùn)行輸出:

foo, bar, baz
1, 2, 3
1.1, 2.2, 3.3
true, false, true
f, o, o

輸出符合預(yù)期,我們通過反射,只用一個(gè)函數(shù)便可將任意類型的切片連接成字符串。

3.dablelv/cyan

以上代碼已放到開源 Go 工具函數(shù)庫(kù) dablelv/cyan,可直接通過 go mod 方式進(jìn)行 import 然后使用。

歡迎大家協(xié)同共建該工具函數(shù)庫(kù)。

import (
	"github.com/dablelv/cyan/str"
)

str.Join([]string{"foo", "bar", "baz"}, ", ")
str.Join([]int{1, 2, 3}, ", ")
str.Join([]float64{1.1, 2.2, 3.3}, ", ")
str.Join([]bool{true, false, true}, ", ")
str.Join("foo", ", ")

4.小結(jié)

對(duì)于字符串切片可以使用標(biāo)準(zhǔn)庫(kù) strings.Join 函數(shù),對(duì)于其他任意類型的切片,利用 Golang 提供的反射能力,在運(yùn)行時(shí)將切片元素轉(zhuǎn)換為字符串并連接到一起。

參考文獻(xiàn)

strings - Go Packages

github.com/dablelv/go-huge-util

到此這篇關(guān)于Golang切片連接成字符串的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Golang切片連接成字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang sync.Pool 指針數(shù)據(jù)覆蓋問題解決

    golang sync.Pool 指針數(shù)據(jù)覆蓋問題解決

    本文主要介紹了使用sync.Pool時(shí)遇到指針數(shù)據(jù)覆蓋的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • golang使用接口進(jìn)行靈活緩存

    golang使用接口進(jìn)行靈活緩存

    緩存是編程中一種常見的技術(shù),通過存儲(chǔ)昂貴的計(jì)算或?IO?結(jié)果來快速查找,從而提高性能,本文將介紹一下Go的接口如何幫助構(gòu)建靈活、可擴(kuò)展的緩存,感興趣的可以了解下
    2023-09-09
  • GO語言make()分配用法實(shí)例

    GO語言make()分配用法實(shí)例

    這篇文章主要介紹了GO語言make()分配用法,實(shí)例分析了make()的功能及使用技巧,需要的朋友可以參考下
    2015-02-02
  • Go中crypto/rsa庫(kù)的高效使用指南

    Go中crypto/rsa庫(kù)的高效使用指南

    本文主要介紹了Go中crypto/rsa庫(kù)的高效使用指南,從 RSA 的基本原理到 crypto/rsa 庫(kù)的實(shí)際應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • go中sync.Once實(shí)現(xiàn)懶加載

    go中sync.Once實(shí)現(xiàn)懶加載

    本文主要介紹了go中sync.Once實(shí)現(xiàn)懶加載,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • goland中npm無法使用的問題及解決

    goland中npm無法使用的問題及解決

    這篇文章主要介紹了goland中npm無法使用的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于Golang編寫一個(gè)聊天工具

    基于Golang編寫一個(gè)聊天工具

    這篇文章主要為大家詳細(xì)介紹了如何使用?Golang?構(gòu)建一個(gè)簡(jiǎn)單但功能完善的聊天工具,利用?WebSocket?技術(shù)實(shí)現(xiàn)即時(shí)通訊的功能,需要的小伙伴可以參考下
    2023-11-11
  • 深入了解GoLang中的工廠設(shè)計(jì)模式

    深入了解GoLang中的工廠設(shè)計(jì)模式

    這篇文章主要介紹了深入了解GoLang中的工廠設(shè)計(jì)模式,工廠模式是一種常用的設(shè)計(jì)模式,它屬于創(chuàng)建型模式,它的主要目的是封裝對(duì)象的創(chuàng)建過程,將對(duì)象的創(chuàng)建過程與對(duì)象的使用過程分離,從而提高代碼的可維護(hù)性和可擴(kuò)展性,需要詳細(xì)了解可以參考下文
    2023-05-05
  • Go語言判斷文件或文件夾是否存在的方法

    Go語言判斷文件或文件夾是否存在的方法

    這篇文章主要介紹了Go語言判斷文件或文件夾是否存在的方法,結(jié)合具體實(shí)例形式對(duì)比分析了Go語言針對(duì)文件與目錄判斷的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • Go中map數(shù)據(jù)類型3點(diǎn)小知識(shí)

    Go中map數(shù)據(jù)類型3點(diǎn)小知識(shí)

    這篇文章主要介紹了Go中map數(shù)據(jù)類型3點(diǎn)小知識(shí),在go中使用map時(shí)可能會(huì)用本文中的小知識(shí),需要的朋友可以參考下
    2014-10-10

最新評(píng)論

新宁县| 乐清市| 荆州市| 当涂县| 乌拉特后旗| 封丘县| 陆丰市| 汝州市| 基隆市| 九龙城区| 珠海市| 兴山县| 洛浦县| 甘孜| 资兴市| 郓城县| 堆龙德庆县| 宁明县| 乡城县| 内丘县| 柞水县| 织金县| 汝南县| 太康县| 郯城县| 沧州市| 司法| 巩留县| 石棉县| 枣庄市| 台东市| 萨嘎县| 江津市| 休宁县| 台中县| 邓州市| 额济纳旗| 桓仁| 新昌县| 类乌齐县| 望奎县|