go基础语法夺命连环50问,你能坚持到第几问?
1。使用值为nil的slice、map会发生啥
允许对值为nil的slice添加元素,但绝对值为nil的map添加元素,则会造成运行迟缓panic。map错误示例funcmain(){varmmap〔string〕intm〔one〕1error:panic:assignmenttoentryinnilmapm:make(map〔string〕int)map的正确声明,分配了实际的内存}slice正确示例funcmain(){vars〔〕intsappend(s,1)}复制代码2。访问map中的key,需要注意啥
当访问map中不存在的key时,Go则会返回元素对应数据类型的零值,比如nil、’’、false和0,取值操作总有值返回,故不能通过取出来的值,来判断key是不是在map中。
检查key是否存在可以用map直接访问,检查返回的第二个参数即可。错误的key检测方式funcmain(){x:map〔string〕string{one:2,two:,three:3}ifv:x〔two〕;v{fmt。Println(keytwoisnoentry)键two存不存在都会返回的空字符串}}正确示例funcmain(){x:map〔string〕string{one:2,two:,three:3}if,ok:x〔two〕;!ok{fmt。Println(keytwoisnoentry)}}复制代码3。string类型的值可以修改吗
不能,尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。
string类型的值是只读的二进制byteslice,如果真要修改字符串中的字符,将string转为〔〕byte修改后,再转为string即可。修改字符串的错误示例funcmain(){x:textx〔0〕Terror:cannotassigntox〔0〕fmt。Println(x)}修改示例funcmain(){x:textxBytes:〔〕byte(x)xBytes〔0〕T注意此时的T是rune类型xstring(xBytes)fmt。Println(x)Text}复制代码4。switch中如何强制执行下一个case代码块
switch语句中的case代码块会默认带上break,但可以使用fallthrough强制执行下一个任务case代码块。funcmain(){isSpace:func(charbyte)bool{switchchar{case:空格符会直接break,返回false和其他语言不一样fallthrough返回truecase:returntrue}returnfalse}fmt。Println(isSpace())truefmt。Println(isSpace())false}复制代码5。你是如何关闭HTTP的响应体的
直接在处理HTTP响应错误的代码块中,直接关闭非nil的响应体;手动调用defer来关闭响应体。正确示例funcmain(){resp,err:http。Get(http:www。baidu。com)关闭resp。Body的正确姿势ifresp!nil{deferresp。Body。Close()}checkError(err)deferresp。Body。Close()body,err:ioutil。ReadAll(resp。Body)checkError(err)fmt。Println(string(body))}复制代码6。你是否主动关闭过http连接,为啥要这样做
有关闭,不关闭程序可能会消耗完socket描述符。有如下2种关闭方式:直接设置请求变量的Close字段值为true,每次请求结束后就会主动关闭连接。设置Header请求头部选项Connection:close,然后服务器返回的响应头部也会有这个选项,此时HTTP标准库会主动断开连接主动关闭连接funcmain(){req,err:http。NewRequest(GET,http:golang。org,nil)checkError(err)req。Closetruereq。Header。Add(Connection,close)等效的关闭方式resp,err:http。DefaultClient。Do(req)ifresp!nil{deferresp。Body。Close()}checkError(err)body,err:ioutil。ReadAll(resp。Body)checkError(err)fmt。Println(string(body))}复制代码你可以创建一个自定义配置的系统HTTPtransport客户端,用来取消HTTP全局的复用连接。funcmain(){tr:http。Transport{DisableKeepAlives:true}client:http。Client{Transport:tr}resp,err:client。Get(https:golang。google。cn)ifresp!nil{deferresp。Body。Close()}checkError(err)fmt。Println(resp。StatusCode)200body,err:ioutil。ReadAll(resp。Body)checkError(err)fmt。Println(len(string(body)))}复制代码7。解析JSON数据时,默认将数值当做哪种类型
在encodedecodeJSON数据时,Go默认会将数值当做float64处理。funcmain(){vardata〔〕byte({status:200})varresultmap〔string〕interface{}iferr:json。Unmarshal(data,result);err!nil{log。Fatalln(err)}复制代码
解析出来的200是float类型。8。如何从panic中恢复
在一个defer延迟执行的函数中调用recover,它便能捕捉中断panic。错误的recover调用示例funcmain(){recover()什么都不会捕捉panic(notgood)发生panic,主程序退出recover()不会被执行println(ok)}正确的recover调用示例funcmain(){deferfunc(){fmt。Println(recovered:,recover())}()panic(notgood)}复制代码9。简短声明的变量需要注意啥简短声明的变量只能在函数内部使用struct的变量字段不能使用:来赋值不能用简短声明方式来单独为一个变量重复声明,:左侧至少有一个新变量,才允许多变量的重复声明10。range迭代map是有序的吗
无序的。Go的运行时是有意打乱迭代顺序的,所以你得到的迭代结果可能不一致。但也并不总会打乱,得到连续相同的5个迭代结果也是可能的。11。recover的执行时机
无,recover必须在defer函数中运行。recover捕获的是祖父级调用时的异常,直接调用时无效。funcmain(){recover()panic(1)}复制代码
直接defer调用也是无效。funcmain(){deferrecover()panic(1)}复制代码
defer调用时多层嵌套依然无效。funcmain(){deferfunc(){func(){recover()}()}()panic(1)}复制代码
必须在defer函数中直接调用才有效。funcmain(){deferfunc(){recover()}()panic(1)}复制代码12。闭包错误引用同一个变量问题怎么处理
在每轮迭代中生成一个局部变量i。如果没有i:i这行,将会打印同一个变量。funcmain(){fori:0;i5;i{i:ideferfunc(){println(i)}()}}复制代码
或者是通过函数参数传入i。funcmain(){fori:0;i5;i{deferfunc(iint){println(i)}(i)}}复制代码13。在循环内部执行defer语句会发生啥
defer在函数退出时才能执行,在for执行defer会导致资源延迟释放。funcmain(){fori:0;i5;i{func(){f,err:os。Open(pathtofile)iferr!nil{log。Fatal(err)}deferf。Close()}()}}复制代码
func是一个局部函数,在局部函数里面执行defer将不会有问题。14。说出一个避免Goroutine泄露的措施
可以通过context包来避免内存泄漏。funcmain(){ctx,cancel:context。WithCancel(context。Background())ch:func(ctxcontext。Context)chanint{ch:make(chanint)gofunc(){fori:0;;i{select{casectx。Done():returncasechi:}}}()returnch}(ctx)forv:rangech{fmt。Println(v)ifv5{cancel()break}}}复制代码
下面的for循环停止取数据时,就用cancel函数,让另一个协程停止写数据。如果下面for已停止读取数据,上面for循环还在写入,就会造成内存泄漏。15。如何跳出forselect循环
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,forselect配合时,break并不能跳出循环。functestSelectFor2(chExitchanbool){EXIT:for{select{casev,ok:chExit:if!ok{fmt。Println(closechannel2,v)breakEXITgotoEXIT2}fmt。Println(ch2val,v)}}EXIT2:fmt。Println(exittestSelectFor2)}复制代码16。如何在切片中查找
go中使用sort。searchXXX方法,在排序好的切片中查找指定的方法,但是其返回是对应的查找元素不存在时,待插入的位置下标(元素插入在返回下标前)。
可以通过封装如下函数,达到目的。funcIsExist(s〔〕string,tstring)(int,bool){iIndex:sort。SearchStrings(s,t)bExist:iIndex!len(s)s〔iIndex〕treturniIndex,bExist}复制代码17。如何初始化带嵌套结构的结构体
go的哲学是组合优于继承,使用struct嵌套即可完成组合,内嵌的结构体属性就像外层结构的属性即可,可以直接调用。
注意初始化外层结构体时,必须指定内嵌结构体名称的结构体初始化,如下看到s1方式报错,s2方式正确。typestPeoplestruct{GenderboolNamestring}typestStudentstruct{stPeopleClassint}尝试4嵌套结构的初始化表达式vars1stStudent{false,JimWen,3}vars2stStudent{stPeople{false,JimWen},3}fmt。Println(s2。Gender,s2。Name,s2。Class)复制代码18。切片和数组的区别
数组是具有固定长度,且拥有零个或者多个,相同数据类型元素的序列。数组的长度是数组类型的一部分,所以〔3〕int和〔4〕int是两种不同的数组类型。数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变;数组是值传递。数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。
当作为方法的参数传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。数组定义:vararray〔10〕intvararray〔5〕int{1,2,3,4,5}复制代码
切片表示一个拥有相同类型元素的可变长度的序列。切片是一种轻量级的数据结构,它有三个属性:指针、长度和容量。切片不需要指定大小;切片是地址传递;切片可以通过数组来初始化,也可以通过内置函数make()初始化。初始化时lencap,在追加元素时如果容量cap不足时将按len的2倍扩容。切片定义:varslice〔〕typemake(〔〕type,len)复制代码19。new和make的区别
new的作用是初始化一个指向类型的指针(T)。new函数是内建函数,函数定义:funcnew(Type)Type。使用new函数来分配空间。传递给new函数的是一个类型,不是一个值。返回值是指向这个新分配的零值的指针。
make的作用是为slice,map或chan初始化并返回引用(T)。make函数是内建函数,函数定义:funcmake(Type,sizeIntegerType)Type;第一个参数是一个类型,第二个参数是长度;返回值是一个类型。
make(T,args)函数的目的与new(T)不同。它仅仅用于创建Slice,Map和Channel,并且返回类型是T(不是T)的一个初始化的(不是零值)的实例。20。Printf()、Sprintf()、Fprintf()函数的区别用法是什么
都是把格式好的字符串输出,只是输出的目标不一样。
Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。Printf()是和标准输出文件(stdout)关联的,Fprintf则没有这个限制。
Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char。那就是目标字符串地址。
Fprintf(),是把格式字符串输出到指定文件设备中,所以参数比printf多一个文件指针FILE。主要用于文件操作。Fprintf()是格式化输出到一个stream,通常是到文件。21。说说go语言中的for循环
for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。22。Array类型的值作为函数参数
在CC中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。
在Go中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。数组使用值拷贝传参funcmain(){x:〔3〕int{1,2,3}func(arr〔3〕int){arr〔0〕7fmt。Println(arr)〔723〕}(x)fmt。Println(x)〔123〕并不是你以为的〔723〕}复制代码
想改变数组,直接传递指向这个数组的指针类型。传址会修改原数据funcmain(){x:〔3〕int{1,2,3}func(arr〔3〕int){(arr)〔0〕7fmt。Println(arr)〔723〕}(x)fmt。Println(x)〔723〕}复制代码
直接使用slice:即使函数内部得到的是slice的值拷贝,但依旧会更新slice的原始数据(底层array)错误示例funcmain(){x:〔〕string{a,b,c}forv:rangex{fmt。Println(v)123}}正确示例funcmain(){x:〔〕string{a,b,c}for,v:rangex{使用丢弃索引fmt。Println(v)}}复制代码23。说说go语言中的switch语句
单个case中,可以出现多个结果选项。只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case。24。说说go语言中有没有隐藏的this指针
方法施加的对象显式传递,没有被隐藏起来。
golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达方法施加的对象不需要非得是指针,也不用非得叫this。25。go语言中的引用类型包含哪些
切片(slice)、字典(map)、通道(channel)、接口(interface)。26。说说go语言的main函数
main函数不能带参数;main函数不能定义返回值。main函数所在的包必须为main包;main函数中可以使用flag包来获取和解析命令行参数。27。go语言触发异常的场景有哪些空指针解析下标越界除数为0调用panic函数28。说说go语言的beego框架beego是一个golang实现的轻量级HTTP框架beego可以通过注释路由、正则路由等多种方式完成url路由注入可以使用beenew工具生成空工程,然后使用beerun命令自动热编译29。说说go语言的goconvey框架goconvey是一个支持golang的单元测试框架goconvey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面goconvey提供了丰富的断言简化测试用例的编写30。GoStub的作用是什么GoStub可以对全局变量打桩GoStub可以对函数打桩GoStub不可以对类的成员方法打桩GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为31。go语言编程的好处是什么编译和运行都很快。在语言层级支持并行操作。有垃圾处理器。内置字符串和maps。函数是go语言的最基本编程单位。32。说说go语言的select机制select机制用来处理异步IO问题select机制最大的一条限制就是每个case语句里必须是一个IO操作golang在语言级别支持select关键字33。解释一下go语言中的静态类型声明
静态类型声明是告诉编译器不需要太多的关注这个变量的细节。
静态变量的声明,只是针对于编译的时候,在连接程序的时候,编译器还要对这个变量进行实际的声明。34。go的接口是什么在go语言中,interface也就是接口,被用来指定一个对象。接口具有下面的要素:一系列的方法具体应用中并用来表示某个数据类型在go中使用interface来实现多态35。Go语言里面的类型断言是怎么回事
类型断言是用来从一个接口里面读取数值给一个具体的类型变量。类型转换是指转换两个不相同的数据类型。36。go语言中局部变量和全局变量的缺省值是什么
全局变量的缺省值是与这个类型相关的零值。37。go语言编程的好处是什么编译和运行都很快。在语言层级支持并行操作。有垃圾处理器。内置字符串和maps。函数是go语言的最基本编程单位。38。解释一下go语言中的静态类型声明
静态类型声明是告诉编译器不需要太多的关注这个变量的细节。静态变量的声明,只是针对于编译的时候,在连接程序的时候,编译器还要对这个变量进行实际的声明。39。模块化编程是怎么回事
模块化编程是指把一个大的程序分解成几个小的程序。这么做的目的是为了减少程序的复杂度,易于维护,并且达到最高的效率。40。Golang的方法有什么特别之处
函数的定义声明没有接收者。
方法的声明和函数类似,他们的区别是:方法在定义的时候,会在func和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。
Go语言里有两种类型的接收者:值接收者和指针接收者。使用值类型接收者定义的方法,在调用的时候,使用的其实是值接收者的一个副本,所以对该值的任何操作,不会影响原来的类型变量。相当于形式参数。
如果我们使用一个指针作为接收者,那么就会其作用了,因为指针接收者传递的是一个指向原值指针的副本,指针的副本,指向的还是原来类型的值,所以修改时,同时也会影响原来类型变量的值。41。Golang可变参数
函数方法的参数,可以是任意多个,这种我们称之为可以变参数,比如我们常用的fmt。Println()这类函数,可以接收一个可变的参数。可以变参数,可以是任意多个。我们自己也可以定义可以变参数,可变参数的定义,在类型前加上省略号即可。funcmain(){print(1,2,3)}funcprint(a。。。interface{}){for,v:rangea{fmt。Print(v)}fmt。Println()}复制代码
例子中我们自己定义了一个接受可变参数的函数,效果和fmt。Println()一样。可变参数本质上是一个数组,所以我们向使用数组一样使用它,比如例子中的forrange循环。42。GolangSlice的底层实现
切片是基于数组实现的,它的底层是数组,它自己本身非常小,可以理解为对底层数组的抽象。因为基于数组实现,所以它的底层的内存是连续分配的,效率非常高,还可以通过索引获得数据,可以迭代以及垃圾回收优化。切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一个只读对象,其工作机制类似数组指针的一种封装。切片对象非常小,是因为它是只有3个字段的数据结构:指向底层数组的指针切片的长度切片的容量
这3个字段,就是Go语言操作底层数组的元数据。
43。GolangSlice的扩容机制,有什么注意点
Go中切片扩容的策略是这样的:
首先判断,如果新申请容量大于2倍的旧容量,最终容量就是新申请的容量。否则判断,如果旧切片的长度小于1024,则最终容量就是旧容量的两倍。
否则判断,如果旧切片长度大于等于1024,则最终容量从旧容量开始循环增加原来的14,直到最终容量大于等于新申请的容量。如果最终容量计算值溢出,则最终容量就是新申请容量。情况一:原数组还有容量可以扩容(实际容量没有填充完),这种情况下,扩容以后的数组还是指向原来的数组,对一个切片的操作可能影响多个指针指向相同地址的Slice。情况二:原来数组的容量已经达到了最大值,再想扩容,Go默认会先开一片内存区域,把原来的值拷贝过来,然后再执行append()操作。这种情况丝毫不影响原数组。
要复制一个Slice,最好使用Copy函数。44。GolangMap底层实现
Golang中map的底层实现是一个散列表,因此实现map的过程实际上就是实现散表的过程。在这个散列表中,主要出现的结构体有两个,一个叫hmap(aheaderforagomap),一个叫bmap(abucketforaGomap,通常叫其bucket)。
hmap如下所示:
图中有很多字段,但是便于理解map的架构,你只需要关心的只有一个,就是标红的字段:buckets数组。Golang的map中用于存储的结构是bucket数组。而bucket(即bmap)的结构是怎样的呢?bucket:
相比于hmap,bucket的结构显得简单一些,标橙的字段依然是核心,我们使用的map中的key和value就存储在这里。
高位哈希值数组记录的是当前bucket中key相关的索引,稍后会详细叙述。还有一个字段是一个指向扩容后的bucket的指针,使得bucket会形成一个链表结构。整体的结构应该是这样的:
Golang把求得的哈希值按照用途一分为二:高位和低位。低位用于寻找当前key属于hmap中的哪个bucket,而高位用于寻找bucket中的哪个key。需要特别指出的一点是:map中的keyvalue值都是存到同一个数组中的。这样做的好处是:在key和value的长度不同的时候,可以消除padding带来的空间浪费。
Map的扩容:当Go的map长度增长到大于加载因子所需的map长度时,Go语言就会将产生一个新的bucket数组,然后把旧的bucket数组移到一个属性字段oldbucket中。
注意:并不是立刻把旧的数组中的元素转义到新的bucket当中,而是,只有当访问到具体的某个bucket的时候,会把bucket中的数据转移到新的bucket中。45。JSON标准库对nilslice和空slice的处理是一致的吗
首先JSON标准库对nilslice和空slice的处理是不一致。
通常错误的用法,会报数组越界的错误,因为只是声明了slice,却没有给实例化的对象。varslice〔〕intslice〔1〕0复制代码
此时slice的值是nil,这种情况可以用于需要返回slice的函数,当函数出现异常的时候,保证函数依然会有nil的返回值。
emptyslice是指slice不为nil,但是slice没有值,slice的底层的空间是空的,此时的定义如下:slice:make(〔〕int,0)slice:〔〕int{}复制代码
当我们查询或者处理一个空的列表的时候,这非常有用,它会告诉我们返回的是一个列表,但是列表内没有任何值。总之,nilslice和emptyslice是不同的东西,需要我们加以区分的。46。Golang的内存模型,为什么小对象多了会造成gc压力
通常小对象过多会导致GC三色法消耗过多的GPU。优化思路是,减少对象分配。47。DataRace问题怎么解决?能不能不加锁解决这个问题
同步访问共享数据是处理数据竞争的一种有效的方法。
golang在1。1之后引入了竞争检测机制,可以使用gorunrace或者gobuildrace来进行静态检测。其在内部的实现是,开启多个协程执行同一个命令,并且记录下每个变量的状态。
竞争检测器基于CC的ThreadSanitizer运行时库,该库在Google内部代码基地和Chromium找到许多错误。这个技术在2012年九月集成到Go中,从那时开始,它已经在标准库中检测到42个竞争条件。现在,它已经是我们持续构建过程的一部分,当竞争条件出现时,它会继续捕捉到这些错误。
竞争检测器已经完全集成到Go工具链中,仅仅添加race标志到命令行就使用了检测器。gotestracemypkg测试包gorunracemysrc。go编译和运行程序gobuildracemycmd构建程序goinstallracemypkg安装程序复制代码
要想解决数据竞争的问题可以使用互斥锁sync。Mutex,解决数据竞争(Datarace),也可以使用管道解决,使用管道的效率要比互斥锁高。48。在range迭代slice时,你怎么修改值的
在range迭代中,得到的值其实是元素的一份值拷贝,更新拷贝并不会更改原来的元素,即是拷贝的地址并不是原有元素的地址。funcmain(){data:〔〕int{1,2,3}for,v:rangedata{v10data中原有元素是不会被修改的}fmt。Println(data:,data)data:〔123〕}复制代码
如果要修改原有元素的值,应该使用索引直接访问。funcmain(){data:〔〕int{1,2,3}fori,v:rangedata{data〔i〕v10}fmt。Println(data:,data)data:〔102030〕}复制代码
如果你的集合保存的是指向值的指针,需稍作修改。依旧需要使用索引访问元素,不过可以使用range出来的元素直接更新原有值。funcmain(){data:〔〕struct{numint}{{1},{2},{3},}for,v:rangedata{v。num10直接使用指针更新}fmt。Println(data〔0〕,data〔1〕,data〔2〕){10}{20}{30}}复制代码49。nilinterface和nilinterface的区别
虽然interface看起来像指针类型,但它不是。interface类型的变量只有在类型和值均为nil时才为nil如果你的interface变量的值是跟随其他变量变化的,与nil比较相等时小心。如果你的函数返回值类型是interface,更要小心这个坑:funcmain(){vardatabytevarininterface{}fmt。Println(data,datanil)niltruefmt。Println(in,innil)niltrueindatafmt。Println(in,innil)nilfalsedata值为nil,但in值不为nil}正确示例funcmain(){doIt:func(argint)interface{}{varresultstruct{}nilifarg0{resultstruct{}{}}else{returnnil明确指明返回nil}returnresult}ifres:doIt(1);res!nil{fmt。Println(Goodresult:,res)}else{fmt。Println(Badresult:,res)Badresult:nil}}复制代码50。select可以用于什么
常用于goroutine的完美退出。
golang的select就是监听IO操作,当IO操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作。
深圳福田罗湖两区全域管控,室内密闭场所暂停营业,暂停堂食!变异株BA。5。2,哈尔滨首次在本土病例检出点蓝字关注,不迷路深圳两区实行全域管控福田全域(除园岭街道华强北街道南园街道外)实行管控措施为应对当前疫情防控形势,严控疫情传播风险,尽快实现社会面动态清零,更好保障居民群众健康安
妖孽的诱惑外面的阳光很灿烂,然而她的心,却冷得没有任何的温度,不知道自己在做什么,不知道走向哪里,她只是这样紧紧的抓住身边这个有力的胳膊,跟着他的方向,一步步的离开走到无人的小巷里,欧慕瑄停
我军战机遭台军驱离?广播对话曝光,我军飞行员6字回应彰显霸气美国里根号航母已经返回基地,但台军仍未放弃反制意图,试射飞弹重炮演习都来了一遍,可还是无法阻止我军战机军舰穿越海峡中线,而且几乎每天都会穿越。如今在台海的演习与警巡已经变成常态化,
无条件偏向你安小悦,你是我的妻子。宫予墨忍不住轻笑出声,我当然相信你,你要对自己有信心。听到这话,安小悦心里一暖,嘴上还是说道,可是她是唐思音。她是唐思音,是他曾经的未婚妻呀。但你是墨太太。宫
(自热火锅)海底捞和小龙坎哪个更好吃?我们平时吃火锅,除了底料可以说是影响最大外,食材就是第二大重要了。而选择什么样的底料,也是要看个人口感的。而自热火锅同样如此,不同的口味,有不同的人喜欢。像海底捞的自热火锅底料,一
59岁冯远征的消失,是娱乐圈的悲哀和损失2001年,一部反应家庭暴力的电视剧不要和陌生人说话在当时掀起一股热播狂潮,心理变态的医生安嘉和一个眼神,成为无数人的心理阴影。而作为安嘉和扮演者的冯远征凭借这部剧一夜爆红。因为演
一语成二婚女成金凤凰刘彻金屋藏娇,名闻天下,其实得益于她母亲的母亲臧儿,因为不甘心做一辈子农妇。因为王娡入宫后已是有夫之妇,还有了一女儿金俗。王娡当时也安贫乐道,心情踏实。可她母亲臧儿不一样,整天想着
不小心撞了卖切糕的,我这车还保得住吗?哈哈哈哈你说呢?看着感觉没有啥问题床头吵架,床位和这是不是在孟婆哪里忘记喝孟婆汤了本来是放风筝的,现在放了一个寂寞当初上学的时候,你会这项技能吗?狗子犯了错就要认,没有啥可说的大熊猫没有雪糕的日子
绿萝爱喝3种水,换着浇堪比施肥,叶子大藤蔓长,个个爆盆绿萝爱喝3种水,换着浇堪比施肥,叶子大藤蔓长,个个爆盆说起绿萝,大家肯定不陌生,每个家庭都会或多或少养几盆绿萝,因为绿萝吸收甲醛的功能很强大,是一种有助于身体健康的花。如果是新房的
团结就是力量谁是我们的敌人?谁是我们的朋友?这个问题是革命的首要问题。中国过去一切革命斗争成效甚少,其基本原因就是因为不能团结真正的朋友,以攻击真正的敌人。中国社会各阶级的分析毛泽东面对当前的
美国航母就这么走了?台湾太失望了解放军围台演习以来,台湾当局一直将美国部署在台湾附近的美国里根号航母打击群当成救命稻草。特别是五角大楼和白宫官员相继表态要求里根号在台湾附近逗留,甚至鼓吹将派舰机穿越台湾海峡,更是