今日份知识:
curl -x 指定方法名 请求的url -d 请求体body里面的内容 //curl命令
curl -x Get 127.0.0.1:8080/add/user -d jinli
curl如果不指定方法,默认使用get方法,在go里面,get方法到底可以不可以把内容数据写在body里面传递呢
其实是可以的,通常如果我们使用get方法,都是把参数写在url里面,是否支持这个需要看具体的浏览器是否支持,例如google好像就不支持,但是自己写个webui,然后使用curl -x Get去获取body的话是可以获取到的,
但是RFC7231不鼓励这样的方式,所以这样的方式还是有可能读不到的
get方法是幂等性的,post不是幂等的
今日份力扣:14 最长前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。提示:
1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成
今日份思考:使用go实现
字符串和数组其实很像,字符串在go里面一旦定义就无法更改,所以我们想改变字符串,就要拼接,替换等操作,那么也就会出现很多已经写好的api,比如go可以使用+号连接,可以使用fmt.Sprintf,可以使用strings里面的aip,可以使用buffer.strings等函数,
func commentPerf(str []string) string {if str == nil || len(str) == 0 {return ""}temp := ""for i := 0; i < len(str[0]); i++ {for j := 1; j < len(str); j++ {if i >= len(str[j]) || str[j][i] != str[0][i] {return temp}}temp = temp + string(str[0][i])}return temp
}
下面是go实现具体demo
+:会对字符串进行遍历,计算并开辟一个新的空间来存储原来的两个字符串。```go
func main() {a := "nihao"b := "hello"fmt.Println(a + b)
}
Sprintf:必须要用反射获取值,因此有性能损耗
func main() {a := "nihao"b := "hello"c := fmt.Sprintf("%s,%s", a, b)fmt.Println(c)
}
strings.Builder:里面维护了一个可变的字节缓冲区,不用创建新的字符串变量,可以直接往缓冲区增加字符串、字符或字节片段,它是直接把[]byte转换为string,从而避免变量拷贝
type Builder struct {addr *Builderbuf []byte
}func main() {a := "nihao"b := "hello"var bulid strings.Builderbulid.WriteString(a)bulid.WriteString(" ")bulid.WriteString(b)c := bulid.String()fmt.Println(c)
}
bytes.Buffer:字节缓冲器,里面存放都是byte,使用 bytes.Buffer 时,可以避免频繁地创建新的字符串变量,从而减少内存分配,也避免变量拷贝
type Buffer struct {buf []byteoff intlastRead readOp
}func main() {a := "nihao"b := "hello"var bytes bytes.Bufferbytes.WriteString(a)bytes.WriteString(" ")bytes.WriteString(b)c := bytes.String()fmt.Println(c)
}
strings.Join:自定义分隔符,适用对象[]string类型,因为我们传入切片长度固定,所以提前进行容量分配可以减少内存分配
func main() {a := []string{"nihao", "hello"}c := strings.Join(a, "+")fmt.Println(c)
}