操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    吼,各位看官!這幾天網(wǎng)上可是鬧得沸沸揚(yáng)揚(yáng)的,哪吒汽車的CEO張勇在直播時(shí)蹺二郎腿,還罵網(wǎng)友是“舔狗”,這一下子就把網(wǎng)友給惹毛了!今天咱就聊聊這事兒,看看這到底是咋回事兒,網(wǎng)友們都咋想的。

    <script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>


    首先啊,這哪吒汽車的CEO張勇,可是個(gè)能折騰的主兒。為了給自家車造勢(shì),也是拼了老命地在直播里賣力吆喝。可沒(méi)想到,這直播賣車沒(méi)賣出去幾輛,倒是把自己給“賣”出去了!

    直播中,張勇蹺著二郎腿,一副悠哉悠哉的樣子。有網(wǎng)友問(wèn)他:“買哪吒您能為我開車門嗎?”他倒是挺爽快,說(shuō):“只要我有時(shí)間,我鞠躬90度給你開車門都沒(méi)問(wèn)題。”這話聽起來(lái)挺豪爽的,可網(wǎng)友們卻不買賬。

    為啥呢?大家覺(jué)得這蹺二郎腿的姿態(tài),看著就不舒服,更別說(shuō)還罵網(wǎng)友是“舔狗”了。這一下子,網(wǎng)友們的情緒就炸了鍋,紛紛表示這CEO也太囂張了吧!

    不過(guò)呢,這事兒也不是一邊倒的。也有網(wǎng)友覺(jué)得,張勇這就是個(gè)直性子,有啥說(shuō)啥,沒(méi)必要上綱上線。再說(shuō)了,人家CEO也是人,也有自己的情緒和態(tài)度,總不能要求他像機(jī)器人一樣完美無(wú)缺吧?

    這張勇一看事態(tài)不對(duì),趕緊發(fā)微博道歉,說(shuō)蹺二郎腿是因?yàn)檠缓茫谩疤蚬贰币辉~也是一時(shí)沖動(dòng)。可這道歉似乎并沒(méi)能讓網(wǎng)友們消氣,反而引發(fā)了更多的討論。

    有人說(shuō),張勇這道歉不夠誠(chéng)懇,明顯是在敷衍了事;也有人說(shuō),張勇作為CEO,代表的是企業(yè)的形象,他的言行舉止應(yīng)該更加注意才是。

    這事兒啊,說(shuō)大也不大,說(shuō)小也不小。但有一點(diǎn)可以肯定的是,這哪吒汽車的銷量啊,估計(jì)得因?yàn)檫@事兒受點(diǎn)影響了。畢竟嘛,消費(fèi)者買車不僅看車本身的質(zhì)量,還得看這企業(yè)的文化和態(tài)度。這CEO一鬧騰,消費(fèi)者的信心可就得打折扣了。

    話說(shuō)回來(lái),這哪吒汽車也真是夠拼的,CEO都親自下場(chǎng)直播賣車了。可這營(yíng)銷手段啊,還是得講究個(gè)方式方法。不是說(shuō)只要CEO在鏡頭前露個(gè)臉,就能把車給賣出去的。

    這事兒也給我們提了個(gè)醒兒,不管是做企業(yè)還是做人,都得注意自己的言行舉止。畢竟嘛,網(wǎng)絡(luò)時(shí)代,信息傳播得可快了,一不小心就可能把自己給“坑”了。

    所以啊,各位看官,以后在直播、發(fā)微博啥的時(shí)候,可得悠著點(diǎn)兒,別一不小心就成了“網(wǎng)紅”啦!

    這哪吒CEO直播“翻車”的事兒,就這么告一段落了。大家也別太往心里去,就當(dāng)看個(gè)熱鬧吧。畢竟嘛,生活還得繼續(xù),車還得開,日子還得過(guò)嘛!

    藏級(jí)寶寶起名公式之方位篇。

    1. 公式為:姓氏+方位字+自選字。

    2. 方位字甄選:近、遠(yuǎn)、高、邊、際、隅、端、向、位、畔、岸、峰、谷、極、域、界、經(jīng)、緯、中、南、北、東;上、前、后、頂、首、右、里。

    3. 方位本身包含方向和位置兩種含義。位置字的意思多是基于特定的參照物,如:山之峰、河之谷、江之畔、海之岸。既可以和自選字構(gòu)成緊密的聯(lián)想關(guān)系,又能在搭配時(shí)構(gòu)造充滿想象的意境,如:任卿、立首。

    4. 在甄選的方位字之中會(huì)發(fā)現(xiàn)有些具有明確對(duì)應(yīng)關(guān)系的方位字并未在內(nèi),是因?yàn)檫@些方位字在字義和觀念角度與字搭配時(shí)常含有貶義和劣勢(shì)的含義。

    5. 你發(fā)現(xiàn)有哪些字嗎?可以打在評(píng)論區(qū)。相較于剛剛的位置字,表示方向的字常高頻出現(xiàn)在人名當(dāng)中,無(wú)論是在名人還是身邊人的名字當(dāng)中,其中以“東”和“中”字最為常用。往小了說(shuō)是因其符合人們對(duì)文字言簡(jiǎn)意賅的樸實(shí)需求,往大了說(shuō)是因這樣的“國(guó)民字”蘊(yùn)含著每個(gè)中國(guó)人都具有和理解的民族精神、哲學(xué)思想和文化傳統(tǒng)。

    寶寶起名門道,鎖定這個(gè)頻道,持續(xù)更新中。

    家好,我是站長(zhǎng) polarisxu。

    我之前寫過(guò)一篇文章:為什么 Go 標(biāo)準(zhǔn)庫(kù)中有些函數(shù)只有簽名,沒(méi)有函數(shù)體?,其中有一點(diǎn)就是 //go:linkname 這個(gè)指令。

    Go 中類似的指令挺多的,比如 Go1.16 中的 //go:embed。前些天有人問(wèn)我,為什么它用 //go:embed 不起作用?我一看,它是這么寫的:// go:embed,不知道你看到問(wèn)題了沒(méi)有?是的,指令是通過(guò)注釋的方式,但有三點(diǎn)要求,要特別注意:

    • // 后不能有空格。有些人可能習(xí)慣 // 后不加空格。但一般認(rèn)為,// 后應(yīng)該加一個(gè)空格。不過(guò) go 指令卻要求不能有空格,這是一個(gè)小“坑”,得注意。所以上面那位朋友就是加了空格,導(dǎo)致出問(wèn)題。(程序并不會(huì)報(bào)錯(cuò),只是沒(méi)有得到自己想要的結(jié)果)
    • 代碼和指令之間不能有空行或其他注釋。這一點(diǎn)應(yīng)該還好,很多人不會(huì)用錯(cuò)吧;
    • 一般來(lái)說(shuō),使用指令需要導(dǎo)入相應(yīng)的包。比如 //go:linkname 指令要求導(dǎo)入 unsafe 包,一般會(huì) import _ "unsafe”//go:embed 指令,要求導(dǎo)入 embed 包。

    有另外一位 Go 朋友「橘中秘士」微信私聊我:

    大佬好,能不能寫一篇 linkname 的文章。目前已經(jīng)有了一些初步概念,但是尚有一些疑團(tuán)不是特別清晰。

    //go:linkname localname remotename,其中 local 作為占位符 remote 作為實(shí)現(xiàn)者或者 local 作為實(shí)現(xiàn)者 remote 作為占位符都是可以的。目前理解的就是給 Symbol 添加了一個(gè) Linkname,查找 Symbo l的時(shí)候用 remote。

    譬如 //go:linkname runtimeNano runtime.nanotime,runtimeNano 作為占位符 runtime.nanotime 提供實(shí)現(xiàn),任何調(diào)用 runtimeNano 的地方實(shí)際替換為對(duì) runtime.nanotime 的調(diào)用,這種場(chǎng)景比較容易接受。

    譬如 //go:linkname runtime_cmpstring runtime.cmpstring,runtime_cmpstring 提供實(shí)現(xiàn) runtime.cmpstring作為占位符,是不是這時(shí)符號(hào)表里不存在 runtime_cmpstring 只有 runtime.cmpstring?

    經(jīng)過(guò)簡(jiǎn)單溝通,他寫了一篇文章解決自己的困惑。希望對(duì)各位有幫助。以下是他寫的關(guān)于 //go:linkname 的文章(我做了一些調(diào)整)。


    01 格式

    //go:linkname local remote
    

    remote 可以沒(méi)有,此時(shí) remote 使用 local 的值,效果就是 local 被導(dǎo)出。

    02 local 和 remote 同時(shí)為函數(shù)

    local 作為占位符,remote 作為實(shí)現(xiàn)者

    標(biāo)準(zhǔn)庫(kù)中的例子:

    // 來(lái)自 time 包
    //go:linkname runtimeNano runtime.nanotime
    func runtimeNano() int64
    
    // 來(lái)自 runtime 包
    //go:nosplit
    func nanotime() int64 {
     return nanotime1()
    }
    

    此時(shí)二進(jìn)制文件中并沒(méi)有runtimeNano,直接轉(zhuǎn)化為對(duì)runtime.nanotime的調(diào)用。

    local 作為實(shí)現(xiàn)者,remote 作為占位符

    同樣來(lái)自標(biāo)準(zhǔn)庫(kù)。這里存在函數(shù)沒(méi)有函數(shù)體,但是被反向引用。

    // 在標(biāo)準(zhǔn)庫(kù)的一個(gè) internal 中
    //go:linkname runtime_cmpstring runtime.cmpstring
    func runtime_cmpstring(a, b string) int {
     l :=len(a)
     if len(b) < l {
      l=len(b)
     }
     for i :=0; i < l; i++ {
      c1, c2 :=a[i], b[i]
      if c1 < c2 {
       return -1
      }
      if c1 > c2 {
       return +1
      }
     }
     if len(a) < len(b) {
      return -1
     }
     if len(a) > len(b) {
      return +1
     }
     return 0
    }
    
    // 來(lái)自 runtime
    func cmpstring(string, string) int
    

    此時(shí)二進(jìn)制文件中并沒(méi)有runtime_cmpstring,對(duì)應(yīng)的函數(shù)已經(jīng)被命名為runtime.cmpstring。也就是說(shuō),實(shí)現(xiàn)在 internal 包,但最終通過(guò) runtime.cmpstring 來(lái)引用。

    一個(gè)占位符+一個(gè)匯編函數(shù)

    // 在標(biāo)準(zhǔn)庫(kù)的一個(gè) internal 中
    //go:linkname abigen_runtime_memequal runtime.memequal
    func abigen_runtime_memequal(a, b unsafe.Pointer, size uintptr) bool
    

    注意runtime.memequal的實(shí)現(xiàn)并不在runtime包中,使用匯編實(shí)現(xiàn)的話并不要求必須在相應(yīng)的包中。

    # memequal(a, b unsafe.Pointer, size uintptr) bool
    TEXT runtime·memequal(SB),NOSPLIT,$0-25
    	MOVQ	a+0(FP), SI
    	MOVQ	b+8(FP), DI
    	CMPQ	SI, DI
    	JEQ	eq
    	MOVQ	size+16(FP), BX
    	LEAQ	ret+24(FP), AX
    	JMP	memeqbody<>(SB)
    eq:
    	MOVB	$1, ret+24(FP)
    	RET
    

    03 local 和 remote 同時(shí)為變量

    兩個(gè)常規(guī)變量

    //go:linkname overflowError runtime.overflowError
    var overflowError error
    
    //go:linkname divideError runtime.divideError
    var divideError error
    
    //go:linkname zeroVal runtime.zeroVal
    var zeroVal [maxZero]byte
    
    //go:linkname _iscgo runtime.iscgo
    var _iscgo bool=true
    
    //go:cgo_import_static x_cgo_setenv
    //go:linkname x_cgo_setenv x_cgo_setenv
    //go:linkname _cgo_setenv runtime._cgo_setenv
    var x_cgo_setenv byte
    var _cgo_setenv=&x_cgo_setenv
    
    //go:cgo_import_static x_cgo_unsetenv
    //go:linkname x_cgo_unsetenv x_cgo_unsetenv
    //go:linkname _cgo_unsetenv runtime._cgo_unsetenv
    var x_cgo_unsetenv byte
    var _cgo_unsetenv=&x_cgo_unsetenv
    

    一個(gè)占位符+一個(gè)偽符號(hào)

    //go:linkname runtime_inittask runtime..inittask
    var runtime_inittask initTask
    
    //go:linkname main_inittask main..inittask
    var main_inittask initTask
    

    注意是..inittask不是.inittask,而且.inittask只存在于編譯階段,任何包中都無(wú)法聲明該變量。

    這里額外解釋下 ..inittask 為什么兩個(gè)點(diǎn)。第一個(gè)點(diǎn)就是普通的 runtime. 這種調(diào)用方式,第二個(gè)點(diǎn)和 inittask 一起構(gòu)成一個(gè)符號(hào)(變量)。注意,Go 中的變量是不允許以 . 開頭的,所以,這個(gè)叫偽符號(hào),只在不編譯階段存在。

    04 一個(gè)例子

    研究 //go:linkname 是因?yàn)槿缦碌谋尘埃?/span>

    Java 里有 InheritableThreadLocal,SpringWeb 在 ServletActionContext 里使用它,達(dá)到在任何地方都能方便的獲取HttpServletRequest。


    Go 并沒(méi)有提供類似的機(jī)制,即使通過(guò) stack 找到 goroutine id(99% 的文章都是這么介紹的),再配合 sync.Map,也只是實(shí)現(xiàn)了一個(gè)比較粗糙的 ThreadLocal,在子協(xié)程里仍然獲取不到父協(xié)程的內(nèi)容。


    g.label 雖然不是給這種場(chǎng)景準(zhǔn)備的,但它具備了 InheritableThreadLocal 的一切要求,只要我們能夠訪問(wèn)到 label 私有字段,我們就有了完整版的 InheritableThreadLocal。

    下面這個(gè)例子是作者真實(shí)項(xiàng)目中用的。

    在 runtime 和 runtime/pprof 包中有兩個(gè)函數(shù):runtime_setProfLabel 和 runtime_getProfLabel。其中,runtime 包中的提供了實(shí)現(xiàn),而 pprof 中的沒(méi)有提供實(shí)現(xiàn)。如果基于它們創(chuàng)建另外的函數(shù),如下:

    //go:linkname SetPointer runtime/pprof.runtime_setProfLabel
    func SetPointer(ptr unsafe.Pointer)
    
    //go:linkname GetPointer runtime/pprof.runtime_getProfLabel
    func GetPointer() unsafe.Pointer
    

    根據(jù)前面的分析,雖然runtime.runtime_setProfLabel/runtime.runtime_getProfLabel提供了函數(shù)實(shí)現(xiàn),但是二進(jìn)制文件中并不會(huì)出現(xiàn)(見(jiàn)下方代碼),此時(shí)想要調(diào)用必須通過(guò)runtime/pprof.runtime_setProfLabel/runtime/pprof.runtime_getProfLabel,這也是上面linknamepprof而不是runtime的根本原因。

    // 來(lái)自 runtime 包
    //go:linkname runtime_setProfLabel runtime/pprof.runtime_setProfLabel
    func runtime_setProfLabel(labels unsafe.Pointer) {
     if raceenabled {
      racereleasemerge(unsafe.Pointer(&labelSync))
     }
     getg().labels=labels
    }
    
    // 來(lái)自 runtime/pprof 包
    func runtime_setProfLabel(labels unsafe.Pointer)
    
    // 來(lái)自 runtime 包
    //go:linkname runtime_getProfLabel runtime/pprof.runtime_getProfLabel
    func runtime_getProfLabel() unsafe.Pointer {
     return getg().labels
    }
    
    // 來(lái)自 runtime/pprof 包
    func runtime_getProfLabel() unsafe.Pointer
    

    05 總結(jié)

    Go 中有不少指令,有些指令你可能不太需要關(guān)心,也不會(huì)用到。然而有些指令了解它們的意思,對(duì)閱讀相關(guān)代碼很有幫助。

    這篇文章全面介紹了 //go:linkname 指令,不知道是否徹底解除了你的疑惑?歡迎留言交流!

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有