[ GO语言基础语法 (二)| 青训营笔记 ]

60 阅读2分钟

四、类型

type 类型名字 底层类型 和c++的typedef是一样的操作

x&(x-1)用于将x的最低一位非0的bit位清零

这个可以快速查找一个数中(二进制1)1的个数

 func PopCount(x uint64) int {
 ​
     cnt := 0
 ​
     for x > 0 {
         x = x & (x - 1)
         cnt++
     }
 ​
     return cnt
 }

五、基础数据类型

和c++数据类型一样,但是多了一个复数类型

Go语言提供了两种精度的复数类型:

complex64和complex128,分别对应float32和float64两种浮点数精度。

内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:

 var x complex128 = complex(1, 2) // 1+2i
 var y complex128 = complex(3, 4) // 3+4i
 fmt.Println(x*y)                 // "(-5+10i)"
 fmt.Println(real(x*y))           // "-5"
 fmt.Println(imag(x*y))           // "10"

1.字符串中的内置函数

实现basename函数

fmt.Println(basename("a/b/c.go")) // "c" fmt.Println(basename("c.d.go")) // "c.d" fmt.Println(basename("abc")) // "abc"

第一个版本没有使用任何库,手工实现

 func basename(s string) string {
     for i := len(s) - 1; i >= 0; i-- {
         if s[i] == '/' {
             s = s[i+1:]
             break
         }
     }
 ​
     for i := 0; i < len(s); i++ {
         if s[i] == '.' {
             s = s[:i]
             break
         }
     }
 ​
     return s
 }

第二个版本简化,使用strings.LastIndex库函数(这个函数返回最后一个是传入字符的下标)

 func basename(s string) string {
     slash := strings.LastIndex(s, "/") // -1 if "/" not found
     s = s[slash+1:]
 ​
     if dot := strings.LastIndex(s, "."); dot > 0 {
         s = s[:dot]
     }
 ​
     return s
 }

strings包中的实用函数

 func Contains(s, substr string) bool
 func Count(s, sep string) int
 func Fields(s string) []string
 func HasPrefix(s, prefix string) bool
 func Index(s, sep string) int
 func Join(a []string, sep string) string

bytes包中也对应的六个函数:

 func Contains(b, subslice []byte) bool
 func Count(s, sep []byte) int
 func Fields(s []byte) [][]byte
 func HasPrefix(s, prefix []byte) bool
 func Index(s, sep []byte) int
 func Join(s [][]byte, sep []byte) []byte

2.字符串和数字之间的转换

由strconv这个包提供转换功能

把一个数字转换成一个字符串

第一种方法使用fmt.Sprintf返回一个格式化的字符串

 x := 123
 y := fmt.Sprintf("%d", x)

第二种方法是用strconv.Itoa(“整数到ASCII”):

 fmt.Println(y, strconv.Itoa(x)) // "123 123"

字符串转换为整数

可以使用strconv包的Atoi或ParseInt函数,还有用于解析无符号整数的ParseUint函数:

 x, err := strconv.Atoi("123")             // x is an int
 y, err := strconv.ParseInt("123", 10, 64) // base 10, up to 64 bits