这里的`i`指索引, `v`代表的array, slice, 或者string的连续元素。对于字符串,i是一个字节的索引,`v`指向`rune`类型(`rune`类型是`int32`)的一个别名)。maps迭代产生键 - 值对,而channels只产生一个迭代值。
#### Break和continue
像Java一样,GO许可break和continue指定一个标签,但标签上必须指的`for`, `switch`, 或者`select` 语句.
#### Switch 语句
在 `switch` 语句,`case` 标签默认情况下不通过,但你可以让他们 `fallthrough`语句结束的情况下通过了。
switch n {
case 0: // empty case body
case 1:
f() // f is not called when n == 0.
}
但是一个`case`可以包含过个值
switch n {
case 0, 1:
f() // f is called if n == 0 || n == 1.
}
`case`的值可以支持任何类型的相等比较操作符,如字符串或指针。一个丢失表达式的switch语句 等价于表达式为 `true`。
switch {
case n < 0:
f1()
case n == 0:
f2()
default:
f3()
}
#### ++ 和 -- 语句
`++`和`--`只能作为后缀操作符,和仅在语句中,而不是在表达式中。例如,你不可以写`n = i++`。
#### defer语句
`defer`语句调用一个函数的执行被推迟到函数返回那一刻。`defer`语句执行时,被递延的函数的参数被计算,并保存,以备将来使用
f, err := os.Open(“filename”)
defer f.Close() // f will be closed when this function returns.
### Constants(常量)
GO中的常数可能是*untyped*的。这适用于无类型的常量表达式的数字文本,和使用`const`声明的无类型的常量表达式。当它被用在需要一个带类型的值的背景下,一个无类型的常量的可以被转变成有类型的值。这样常量的使用相对自由,即使Go没有隐式类型转换
var a uint
f(a + 1) // The untyped numeric constant 1 becomes typed as uint.
f(a + 1e3) // 1e3 is also typed as uint.
语言对非类型化的数字常量不限制大小。限制仅适用于使用一个常量时,其中一种类型是必需的。
const huge = 1 << 100
var n int = huge >> 98
如果是不存在的变量声明的类型和相应的表达式的计算结果为一个非类型化的数字常数,这个常数是被转换为 `rune`, `int`,`float64`, 或者`complex128` 类型,取决于该值是否一个字符,整数,浮点,或复杂的常数。
c := ‘ä’ // rune (alias for int32)
n := 1 + 2 // int
x := 2.7 // float64
z := 1 + 2i // complex128
GO 不存在枚举类型。相反,你可以使用特殊的名字`iota`在单一的`const`声明中从而得到一系列累加值。当初始化表达式省略为一个`const`,它重用了前面的表达式。
const (
red = iota // red == 0
blue // blue == 1
green // green == 2
)
### Structs(结构体)
结构体对应于Java中的类,但一个结构的成员不能是方法,而是变量。结构体的指针是类似Java的的引用变量。与Java类不同的是,结构也可以被定义为直接值。在这两种情况下使用`.`来访问结构体的成员。
type MyStruct struct {
s string
n int64
}
var x MyStruct // x is initialized to MyStruct{“”, 0}.
var px *MyStruct // px is initialized to nil.
px = new(MyStruct) // px points to the new struct MyStruct{“”, 0}.
x.s = “Foo”
px.s = “Bar”
在Go中,方法可以与任何命名的类型关联,而不仅仅是与结构体。详情见方法和接口的讨论。
### Pointers(指针)
如果你有一个int或struct或者array需要分配对象的内容复制。 想达到Java的引用变量的效果,Go使用指针。对于任何类型e `T`,有一个相应的指针类型`*T`,表示指针类型 `T`的值
给指针变量分配存储空间,使用内置函数`new`,传入一个类型,并返回一个指针,指向分配的存储空间。分配的空间将被零初始化的类型。例如,`new(int)` 分配存储为一个新的int,初始化它的值为e `0`,并返回它的地址,类型 `*int`。
Java代码`T p = new T()`,其中 `T`是一个两个`int`型实例变量`a`和`b`的类,对应于
#### 总结
* 对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**
* 算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈...(最好多刷一刷,不然影响你的工资和成功率????)
* 在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
* 要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
![](https://img-blog.csdnimg.cn/img_convert/41a409bca685b4ea0e0aa1a5589c3e09.png)
第一次跳槽十分忐忑不安,和没毕业的时候开始找工作是一样的感受,真的要相信自己,有条不紊的进行。**如果有我能帮忙的地方欢迎随时找我,比如简历修改、内推、最起码,可以把烦心事说一说**,人嘛都会有苦恼的~
祝大家都有美好的未来,拿下满意的 offer。