四、类型
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