1.for循环使用多个变量
for expression1; expression2; expression3 {
...
}
// 错误写法: ++ --是语句而不是表达式
//不能使用i++,j-- ,正解为:i = i + 1, j = j + 1
func main() {
sum := 0
for i, j := 1, 10; i < j; i++,j++ {
sum += i + j
}
fmt.Println("sum is equal to ", sum)
}
// 正确写法
func main() {
sum := 0
for i, j := 1, 10; i < j; i, j = i+1, j-1 {
sum += i + j
}
fmt.Println("sum is equal to ", sum)
}
2.leetcode:297
func main() {
slice := []string{"1","2","3","4"}
change(slice,0)
fmt.Println("slice = ",slice)
}
func change(s []string,i int) {
s = s[1:]
fmt.Println(s)
if i == 0 {
change(s,i+1)
fmt.Println(s)
}
}
打印:
[2 3 4]
[3 4]
[2 3 4]
slice = [1 2 3 4]
证明:
当无法递归下去返回时,会回到上次的s
故:
func main() {
slice := []string{"1","2","3","4"}
change(&slice,0)
fmt.Println("slice = ",slice)
}
func change(s *[]string,i int) {
*s = (*s)[1:]
fmt.Println(*s)
if i == 0 {
change(s,i+1)
fmt.Println(*s)
}
}
3.Go中不支持指针运算
在Go中 ++ 和 – 只能作为语句而非表达式
a := 1
a ++ // 注意:不能写成 ++ a 或 -- a 必须放在右边使用
// b := a++ // 此处为错误的用法,不能写在一行,要单独作为语句使用
fmt.Println(a) // 2
- Q:leetcode 4
5/2.0 = 2.5
5.运算
&: 按位运算
&&: 两都为真则为真
leetcode 131
for j := 0; j < n; j++ {
for i := 0; i <= j; i++ {
if s[i] == s[j] && (j-i <= 2 || dp[i+1][j-1]) { 此括号内不能反,(dp[i+1][j-1] || j-i <= 2)若为这样,则dp[1][-1]
dp[i][j] = true
}
}
}
6.golong中,没有long类型,long类型=int64
7.注意溢出:
乘法溢出 int32int32最大情况下=int64 1111
加法溢出 int32+int32最大可能溢出一位 11+11 = 100
-2^32 ~ + 2^32-1 除法溢出 leetcode29:
8.注意,golaog无法给某个赋值为nil
wrong
p := nil
此时p不为nil,p.value = 0
p:= &ListNode{}
right
var p *LisNode = nil
9.golong中,使用2^4,此时的 ^ 不再是次方的含义,而是按位异或
求次方,用 math.Pow(a float64, b float64) float64。注意参数和返回值均是float64类型,根据题目需要可能需转换int
golong中,
3/2=1
float64(3/2)=1
3/2.0=1.5
a := 3
a/2.0=1 先对a做类型断言,是int,接着会将变量2.0强制转换成int
11.踩了800次
结构体初始化加逗号!!!逗号!!
func initDLinkedNode(key, value int) *ListNode {
return &ListNode{
key: key, 逗号!
val: value,
}
}