iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
DevOps

欸你這週GO了嘛系列 第 15

[DAY15]golang常用套件(字串類與型態轉換)

  • 分享至 

  • xImage
  •  

字串類

fmt 格式化

1.fmt.Println/Printf:直接在console印出來,可以拿來當輸出log手法之一,簡單暴力,但是非結構法輸出,所以如果要搭配elk的話,可能要使用其他log套件。
2.fmt.Sprintln/Sprintf:格式化輸出成字串,蠻常來拿組sql字串用

以下範例為最基本也最常用到的寫法

package main

import "fmt"

type test struct {
	name string
}

func main() {
	s := test{name: "QQ"}

	//最基礎的寫法,可視同當字串輸出,用逗號可以無限串接
	fmt.Println("print line", "TEST", "GG", 23421, "CC")
	//print line TEST GG 23421 CC

	//Printf 格式化输出,使用占位符號%
	//如果要輸出struct又要需要呈現struct的欄位名時,使用%+v
	fmt.Printf("%+v\n", s)
	//{name:QQ}
	fmt.Printf("%v\n", s)
	//{QQ}

	//Sprintln 直接組合傳入參數成字串
	gg := fmt.Sprintln("A", "b", 1, 2, 3, 4)
	fmt.Println(gg)
	//A b 1 2 3 4

	//Sprintf 格式化輸出,使用占位符號%
	//1.占位符號對應的型態需要跟參數一致才行,不一致時系統會提示錯誤,ex:Sprintf format %s has arg 15 of wrong type int
	//2.占位符號數量與參數一致,不符合數量時會提示錯誤,ex:Sprintf format %s reads arg #2, but call has 1 arg
	//3.string使用%s,如果要補空白可以用%10s(長度不足10位時前補空白),%-10s(長度不足10位時後補空白)
	//4.int使用%d,float使用%f,如果數值補0可用%0.2d(0表示補0 .2表示補齊2數位),ex %0.2d參數值為1時就會輸出成01

	gg = fmt.Sprintf("gg:%s %d %0.9d %5s %-5s", "15", 123, 444, "g", "Q")
	fmt.Println(gg)
	//gg:15 123 000000444     g Q

}

strings — 字符操作

直接用範例呈現好了

package main

import (
	"fmt"
	"strings"
)

func main() {
	test := "mdfk"
	test2 := "2020"
	test3 := "2021"
	//len:取字串長度,也可以拿來取得slice的數量
	testLen := len(test)

	fmt.Println(testLen)
	//Compare:判斷二個字串是否相同,回傳值為int,0為相同,如果參數1小於參數2時回傳-1,反之回傳1,但是不如直接用 == !=比較習慣,除非你需要知道二個字串的大小
	fmt.Println(strings.Compare(test2, test3))
	//EqualFold:判斷lowercase後的字串是否相同,回傳值為bool
	fmt.Println(strings.EqualFold("A", "a"))
	fmt.Println(strings.EqualFold("g123", "G123"))

	fmt.Println("__")
	//Contains:判斷參數2的字串是否存在於參數1字串中,回傳值為bool
	//ContainsAny:判斷參數2的每個字是否存於參數1字串中,回傳值為bool
	fmt.Println(strings.Contains("team", "t"))
	fmt.Println(strings.ContainsAny("mdfk", "m f"))
	//Count:計算參數2出現於參數1的次數,回傳值為int
	fmt.Println(strings.Count("geegeebaby", "e"))
	//Split:把參數1的值,根據參數2的符號進行切割成slice
	source := "lbj,ad,curry,kt"
	s := strings.Split(source, ",")
	fmt.Println(s)
	//Join:把參數1的slice用參數2的符號組成字串
	fmt.Println(strings.Join(s, ","))
	//HasPrefix:判斷參數2是否為參數1的前綴,回傳值為bool
	//HasSuffix:判斷參數2是否為參數1的後綴,回傳值為bool
	fmt.Println(strings.HasPrefix("Google", "Go"))
	fmt.Println(strings.HasSuffix("Google", "le"))
	//Replace:取代字串,參數4代入-1表示全部
	//ReplaceAll:取代全部字串
	fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
	fmt.Println(strings.ReplaceAll("oink oink oink", "oink", "moo"))
    //ToLower:轉小寫
	//ToUpper:轉大寫
	fmt.Println(strings.ToLower("HELLO GOLANG"))
	fmt.Println(strings.ToUpper("hello golang"))
	//Trim:消除參數2的字串
	//TrimSpace:消除空白字元
	uccu := "@#$%^&12456:TEST:   PPPPPPCCCCC"
	fmt.Println(strings.Trim(uccu, "   PPPPPPCCCCC"))
	uccu = "@#$%^&12456:TEST:PPPPPPCCCCC   "
	fmt.Println(strings.TrimSpace(uccu))
 
}

strconv — 字符的型態轉換

1.字串轉數值:
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func Atoi(s string) (i int, err error)

package main

import (
	"fmt"
	"strconv"
)

func main() {
	v := "-1234567"
	d, err := strconv.ParseInt(v, 10, 64)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(d)
    
    //ParseUint遇到字串帶負值時會噴錯誤:ex:strconv.ParseUint: parsing "-1234567": invalid syntax
	v = "1234567"
	d1, err1 := strconv.ParseUint(v, 10, 64)
	if err1 != nil {
		fmt.Println(err1)
	}
	fmt.Println(d1)
    
	//Atoi=ParseInt(s, 10, 0)
	d2, err2 := strconv.Atoi(v)
	if err2 != nil {
		fmt.Println(err2)
	}
	fmt.Println(d2)
}

2.數值轉字串
func FormatUint(i uint64, base int) string // 无符号整型转字符串
func FormatInt(i int64, base int) string // 有符号整型转字符串
func Itoa(i int) string

package main

import (
	"fmt"
	"strconv"
)

func main() {

	var v1 int64 = -1234567
	d4 := strconv.FormatInt(v1, 10)
	fmt.Println(d4)

	var v2 uint64 = 1234567
	d5 := strconv.FormatUint(v2, 10)

	fmt.Println(d5)

	d6 := strconv.Itoa(1234567)

	fmt.Println(d6)
}

3.其他型態轉換
func ParseBool(str string) (value bool, err error)
ParseBool:t, T, TRUE, true, True, 0, f, F, FALSE, false, False 可轉成bool
func FormatBool(b bool) string
FormatBool:轉成"true","false"
func ParseFloat(s string, bitSize int) (f float64, err error)
func FormatFloat(f float64, fmt byte, prec, bitSize int) string

regexp — 正則表達式

因為正則式水超深,建議還是看一下教學更好Golang-Regex-Tutorial

package main

import (
	"fmt"
	"regexp"
)

func main() {
	r, err := regexp.Compile(`Hello`)
	if err != nil {
		fmt.Printf("There is a problem with your regexp.\n")
		return
	}
	if r.MatchString("Hello Regular Expression.") == true {
		fmt.Println("Match ")
	} else {
		fmt.Println("No match ")
	}
    s := "ABCDEEEEE"
	rr := regexp.MustCompile(`\AABCDE{2}|ABCDE{4}`)

	fmt.Println(rr.FindAllString(s, 2))
}


上一篇
[DAY14]動手寫個小程式
下一篇
[DAY16]golang常用套件(時間,JSON,logger)
系列文
欸你這週GO了嘛30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言