午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > Go語言模型:string的底層數據結構與高效操作詳解

Go語言模型:string的底層數據結構與高效操作詳解

熱門標簽:寧波語音外呼系統公司 湛江crm外呼系統排名 仙桃400電話辦理 地圖標注免費定制店 不封卡外呼系統 宿遷便宜外呼系統代理商 鄭州智能語音電銷機器人價格 重慶慶云企業400電話到哪申請 上海極信防封電銷卡價格

Golang的string類型底層數據結構簡單,本質也是一個結構體實例,且是const不可變。

string的底層數據結構

通過下面一個例子來看:

package main
import (
	"fmt"
	"unsafe"
)
// from: string.go 在GoLand IDE中雙擊shift快速找到
type stringStruct struct {
	array unsafe.Pointer // 指向一個 [len]byte 的數組
	length int    // 長度
}
func main() {
	test := "hello"
	p := (*str)(unsafe.Pointer(test))
	fmt.Println(p, p) // 0xc420070018 {0xa3f71 5}
	c := make([]byte, p.length)
	for i := 0; i  p.length; i++ {
		tmp := uintptr(unsafe.Pointer(p.array))   // 指針類型轉換通過unsafe包
		c[i] = *(*byte)(unsafe.Pointer(tmp + uintptr(i))) // 指針運算只能通過uintptr
	}
	fmt.Println(c)   // [104 101 108 108 111]
	fmt.Println(string(c)) // [byte] --> string, "hello"
	test2 := test + " world" // 字符串是不可變類型,會生成一個新的string實例
	p2 := (*str)(unsafe.Pointer(test2))
	fmt.Println(p2, p2) // 0xc420028030 {0xc42000a2e5 11}
	fmt.Println(test2) // hello, world
}

string的拼接與修改

+操作

string類型是一個不可變類型,那么任何對string的修改都會新生成一個string的實例,如果是考慮效率的場景就要好好考慮一下如何修改了。先說一下最長用的+操作,同樣上面的例子,看一下+操作拼接字符串的反匯編:

25		test2 := test + " world"
 0x00000000004824d7 +1127>:	lea 0x105a2(%rip),%rax  # 0x492a80
 0x00000000004824de +1134>:	mov %rax,(%rsp)
 0x00000000004824e2 +1138>:	callq 0x40dda0 runtime.newobject> # 調用newobject函數
 0x00000000004824e7 +1143>:	mov 0x8(%rsp),%rax
 0x00000000004824ec +1148>:	mov %rax,0xa0(%rsp)
 0x00000000004824f4 +1156>:	mov 0xa8(%rsp),%rax
 0x00000000004824fc +1164>:	mov 0x8(%rax),%rcx
 0x0000000000482500 +1168>:	mov (%rax),%rax
 0x0000000000482503 +1171>:	mov %rax,0x8(%rsp)
 0x0000000000482508 +1176>:	mov %rcx,0x10(%rsp)
 0x000000000048250d +1181>:	movq $0x0,(%rsp)
 0x0000000000482515 +1189>:	lea 0x30060(%rip),%rax  # 0x4b257c
 0x000000000048251c +1196>:	mov %rax,0x18(%rsp)
 0x0000000000482521 +1201>:	movq $0x6,0x20(%rsp)
 0x000000000048252a +1210>:	callq 0x43cc00 runtime.concatstring2> # 調用concatstring2函數

因為當前go[2018.11 version: go1.11]的不是遵循默認的x86 calling convention用寄存器傳參,而是通過stack進行傳參,所以go的反匯編不像c的那么容易理解,不過大概看懂+背后的操作還是沒問題的,看一下runtime源碼的拼接函數:

func concatstring2(buf *tmpBuf, a [2]string) string {
 return concatstrings(buf, a[:])
}
// concatstrings implements a Go string concatenation x+y+z+...
// The operands are passed in the slice a.
// If buf != nil, the compiler has determined that the result does not
// escape the calling function, so the string data can be stored in buf
// if small enough.
func concatstrings(buf *tmpBuf, a []string) string {
 idx := 0
 l := 0
 count := 0
 for i, x := range a {
  n := len(x)
  if n == 0 {
   continue
  }
  if l+n  l {
   throw("string concatenation too long")
  }
  l += n
  count++
  idx = i
 }
 if count == 0 {
  return ""
 }
 // If there is just one string and either it is not on the stack
 // or our result does not escape the calling frame (buf != nil),
 // then we can return that string directly.
 if count == 1  (buf != nil || !stringDataOnStack(a[idx])) {
  return a[idx]
 }
 s, b := rawstringtmp(buf, l)
 for _, x := range a {
  copy(b, x) // 最關鍵的拷貝操作
  b = b[len(x):]
 }
 return s
}

分析runtime的concatstrings實現,可以看出+最后新申請buf,拷貝原來的string到buf,最后返回新實例。那么每次的+操作,都會涉及新申請buf,然后是對應的copy。如果反復使用+,就不可避免有大量的申請內存操作,對于大量的拼接,性能就會受到影響了。

bytes.Buffer

通過看源碼,bytes.Buffer 增長buffer時是按照2倍來增長內存,可以有效避免頻繁的申請內存,通過一個例子來看:

func main() {
 var buf bytes.Buffer
 for i := 0; i  10; i++ {
  buf.WriteString("hi ")
 }
 fmt.Println(buf.String())
}

對應的byte包庫函數源碼

// @file: buffer.go
func (b *Buffer) WriteString(s string) (n int, err error) {
 b.lastRead = opInvalid
 m, ok := b.tryGrowByReslice(len(s))
 if !ok {
  m = b.grow(len(s)) // 高效的增長策略 -> let capacity get twice as large
 }
 return copy(b.buf[m:], s), nil
}
// @file: buffer.go
// let capacity get twice as large !!!
func (b *Buffer) grow(n int) int {
 m := b.Len()
 // If buffer is empty, reset to recover space.
 if m == 0  b.off != 0 {
  b.Reset()
 }
 // Try to grow by means of a reslice.
 if i, ok := b.tryGrowByReslice(n); ok {
  return i
 }
 // Check if we can make use of bootstrap array.
 if b.buf == nil  n = len(b.bootstrap) {
  b.buf = b.bootstrap[:n]
  return 0
 }
 c := cap(b.buf)
 if n = c/2-m {
  // We can slide things down instead of allocating a new
  // slice. We only need m+n = c to slide, but
  // we instead let capacity get twice as large so we
  // don't spend all our time copying.
  copy(b.buf, b.buf[b.off:])
 } else if c > maxInt-c-n {
  panic(ErrTooLarge)
 } else {
  // Not enough space anywhere, we need to allocate.
  buf := makeSlice(2*c + n)
  copy(buf, b.buf[b.off:])
  b.buf = buf
 }
 // Restore b.off and len(b.buf).
 b.off = 0
 b.buf = b.buf[:m+n]
 return m
}

string.join

這個函數可以一次申請最終string的大小,但是使用得預先準備好所有string,這種場景也是高效的,一個例子:

func main() {
 var strs []string
 for i := 0; i  10; i++ {
 strs = append(strs, "hi")
 }
 fmt.Println(strings.Join(strs, " "))
}

對應庫的源碼:

// Join concatenates the elements of a to create a single string. The separator string
// sep is placed between elements in the resulting string.
func Join(a []string, sep string) string {
 switch len(a) {
 case 0:
  return ""
 case 1:
  return a[0]
 case 2:
  // Special case for common small values.
  // Remove if golang.org/issue/6714 is fixed
  return a[0] + sep + a[1]
 case 3:
  // Special case for common small values.
  // Remove if golang.org/issue/6714 is fixed
  return a[0] + sep + a[1] + sep + a[2]
 }
 
 // 計算好最終的string的大小
 n := len(sep) * (len(a) - 1) //
 for i := 0; i  len(a); i++ {
  n += len(a[i])
 }
 b := make([]byte, n)
 bp := copy(b, a[0])
 for _, s := range a[1:] {
  bp += copy(b[bp:], sep)
  bp += copy(b[bp:], s)
 }
 return string(b)
}

strings.Builder (go1.10+)

看到這個名字,就想到了Java的庫,哈哈,這個Builder用起來是最方便的,不過是在1.10后引入的。其高效也是體現在2倍速的內存增長, WriteString函數利用了slice類型對應append函數的2倍速增長。

一個例子:

func main() {
 var s strings.Builder
 for i := 0; i  10; i++ {
  s.WriteString("hi ")
 }
 fmt.Println(s.String())
}

對應庫的源碼

@file: builder.go
// WriteString appends the contents of s to b's buffer.
// It returns the length of s and a nil error.
func (b *Builder) WriteString(s string) (int, error) {
 b.copyCheck()
 b.buf = append(b.buf, s...)
 return len(s), nil
}

總結

Golang的字符串處理還是挺方便的,有垃圾回收和一些內置的語言級寫法支持,讓復雜字符串操作沒有那么繁瑣了,比起C/C++高效了不少。

補充:go string的內部實現

go string 內部實現

這個string的探索

來來個例子

func boo(a int, b int)(int, string){
 return a + b, "abcd"
}
81079 000000000044dfa0 main.boo>:
81080 44dfa0:>------48 c7 44 24 18 00 00 >--movq $0x0,0x18(%rsp)
81081 44dfa7:>------00 00- 
81082 44dfa9:>------0f 57 c0    >--xorps %xmm0,%xmm0
81083 44dfac:>------0f 11 44 24 20  >--movups %xmm0,0x20(%rsp)
81084 44dfb1:>------48 8b 44 24 08  >--mov 0x8(%rsp),%rax
81085 44dfb6:>------48 03 44 24 10  >--add 0x10(%rsp),%rax
81086 44dfbb:>------48 89 44 24 18  >--mov %rax,0x18(%rsp)
81087 44dfc0:>------48 8d 05 d4 eb 01 00 >--lea 0x1ebd4(%rip),%rax  # 46cb9b go.string.*+0xbb>
81088 44dfc7:>------48 89 44 24 20  >--mov %rax,0x20(%rsp)
81089 44dfcc:>------48 c7 44 24 28 04 00 >--movq $0x4,0x28(%rsp)
81090 44dfd3:>------00 00- 
81091 44dfd5:>------c3     >--retq---

其中

81087 44dfc0:>------48 8d 05 d4 eb 01 00 >--lea 0x1ebd4(%rip),%rax  # 46cb9b go.string.*+0xbb>
81088 44dfc7:>------48 89 44 24 20  >--mov %rax,0x20(%rsp)
81089 44dfcc:>------48 c7 44 24 28 04 00 >--movq $0x4,0x28(%rsp)
81090 44dfd3:>------00 00- 
81091 44dfd5:>------c3     >--retq---
lea 0x1ebd4(%rip),%rax得到char*, mov %rax,0x20(%rsp)復制給返回值, movq $0x4,0x28(%rsp)把長度也填進去,

其實可以看到string就是c里面的char* 和len的組合

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang中數據結構Queue的實現方法詳解
  • 使用go實現常見的數據結構
  • 淺析go中的map數據結構字典
  • 淺談用Go構建不可變的數據結構的方法
  • golang數據結構之golang稀疏數組sparsearray詳解

標簽:海南 安康 西雙版納 遼寧 青海 物業服務 電子產品 儋州

巨人網絡通訊聲明:本文標題《Go語言模型:string的底層數據結構與高效操作詳解》,本文關鍵詞  語言,模型,string,的,底層,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言模型:string的底層數據結構與高效操作詳解》相關的同類信息!
  • 本頁收集關于Go語言模型:string的底層數據結構與高效操作詳解的相關信息資訊供網民參考!
  • 推薦文章
    国产一区二区女内射| 日韩av第一页| 国产精品欧美风情| 久久riav二区三区| 黄色av网址在线播放| 午夜诱惑痒痒网| 来吧亚洲综合网| 97人妻精品一区二区三区动漫| 日精品一区二区| 久久影院视频免费| 欧美日韩精品在线播放| 亚洲大胆人体在线| 国内免费精品永久在线视频| aa日韩免费精品视频一| 久久99九九| 欧美 日本 亚洲| 北岛玲一区二区| 美日韩一二三区| 日韩国产欧美三级| 国产欧美日韩亚州综合| 欧美日韩在线免费视频| 神马久久久久久| 川上优av一区二区线观看| 一区二区三区四区五区视频| 超碰成人在线播放| 五月天av网站| 草草视频在线播放| 91丝袜美腿高跟国产极品老师| 精品久久久久久中文字幕一区奶水 | 久久久国产一区| 国产www精品| 一区二区三区电影| 亚洲成人手机在线观看| 久久综合色综合| 天天操天天干天天插| 国产视频一区二区在线| 51精品秘密在线观看| 欧美精品亚州精品| 成人免费看片网址| 男人天堂网视频| 99久久久无码国产精品衣服| 中文字幕人妻色偷偷久久| 国产自产2019最新不卡| 亚洲电影激情视频网站| 亚洲精品色婷婷福利天堂| 91精品国产91久久久久福利| 日韩免费一区二区三区| 亚洲一级片av| 亚洲精品1区2区3区| 蜜桃av一区二区在线观看 | 成人手机在线播放| 日韩Av无码精品| 九九热最新视频| 国产精品小仙女| 色天使色偷偷av一区二区| www.亚洲成人| 黄色一区三区| 久久出品必属精品| 亚洲天堂视频网站| 国产精品自拍三区| 亚洲国产精品久久艾草纯爱| 欧美成人激情免费网| 2020欧美日韩在线视频| 精品一区二区成人免费视频| 少妇伦子伦精品无吗| 伦av综合一区| www.66久久| 9191国产精品| 日本成人在线视频网址| 天天干天天色天天爽| 日本天堂在线播放| 一卡二卡三卡在线| 国产亚洲综合色| 亚洲精品一区二区三区香蕉| 国产精品高清在线观看| 日韩人妻一区二区三区蜜桃视频| 黄色aaa视频| 丰满人妻av一区二区三区| 亚洲色图制服丝袜| 亚洲性猛交xxxxwww| 国产精品12| 尤物网站在线看| 国产女主播喷水视频在线观看| 成人高清视频在线| 欧美一区二区三区免费在线看| 国产极品精品在线观看| 每日在线观看av| 看免费黄色录像| 久久99精品国产.久久久久| 日韩欧美亚洲国产一区| 国自产精品手机在线观看视频| www.午夜色| 中文字幕在线免费看线人| 一本一道精品欧美中文字幕| 国产三区在线成人av| 日韩激情av在线免费观看| 91偷拍精品一区二区三区| 一级做a免费视频| 中文字幕免费高清网站| 日本一区二区高清| 亚洲色图欧美制服丝袜另类第一页| 91天堂在线观看| 亚洲无在线观看| 在线免费看91| 亚洲美女在线一区| 久久亚洲精品一区| 色哟哟免费网站| 97成人资源站| 国产一区二区女| 欧美视频完全免费看| 久久精品国产一区二区三| 亚洲三级在线视频| 国产精品久久久久久久久电影网| www.com.av| 麻豆精品视频在线观看免费 | 精品91一区二区三区| 小早川怜子久久精品中文字幕| 香港一级纯黄大片| 欧美日韩国产中文精品字幕自在自线| 97人人爽人人喊人人模波多 | 久久69精品久久久久久国产越南| 亚洲国产激情一区二区三区| 69xxx免费| 韩国精品一区二区| 日韩精品一区二区三区视频在线观看| 亚洲字幕在线观看| 国产精品久久久久久久99| 国产精品一区二区入口九绯色| 色狠狠久久av五月综合| 国语自产偷拍精品视频偷| 热re99久久精品国99热蜜月| 中字幕一区二区三区乱码| 美女网站色91| 日韩一卡二卡三卡| 高清不卡日本v二区在线| 超碰caoprom| 日韩高清中文字幕一区| 欧美另类videos死尸| 1区1区3区4区产品乱码芒果精品| 台湾佬美性中文| 久久精品欧洲| 91.成人天堂一区| 成人免费福利在线| 国产视频久久久久久| 视频一区二区三区在线| 91精品国产手机| 国产在线资源一区| 91精品国产自产在线老师啪 | 欧美精品电影免费在线观看 | 亚洲精品久久久久久久蜜桃| 国产精品视频免费| 久久国产精品电影| 国产伦精品一区二区三区四区视频_| 久久精品波多野结衣| 久久久一区二区| 久久精品视频一| 午夜精品久久久久久久无码 | 欧洲第一无人区观看| 99视频有精品| 久久精品国产v日韩v亚洲| 国产成a人亚洲精v品在线观看| 国产一级视频在线| 中文字幕日韩一区二区| 久久乐国产精品| 超碰成人在线播放| 久久久人人人| 亚洲成人av片| 中国黄色录像片| 精品在线播放视频| 一区二区三区成人| 国产精品久久久久久久久久久不卡| 久久久久久无码精品人妻一区二区| 日日噜噜夜夜狠狠视频欧美人 | 日韩福利视频在线观看| 懂色av粉嫩av蜜臀av| 在线观看 亚洲| 亚洲国产cao| 亚洲中国色老太| 免费视频91蜜桃| 91老司机福利 在线| 久久福利视频导航| 国产精品一区二区小说| 久久婷婷激情| 亚洲精品黄网在线观看| 亚洲精品天堂成人片av在线播放 | 一级片在线免费观看视频| 狠狠久久亚洲欧美专区| 国产精品 日韩| caoporn91| 亚洲欧美精品午睡沙发| 国产精品久久久久久久久久| 成人做爰69片免费| 国产精品影视在线| 日韩在线国产精品| 深夜黄色小视频| 秋霞av亚洲一区二区三| 亚洲人成五月天| 欧美二区在线视频| 日韩一级片免费看| 亚洲精品成人久久| 日本天堂免费a| 99久久国产热无码精品免费| 欧美高清视频一二三区 | 无码一区二区三区| 日韩欧中文字幕| 国产一区二区丝袜| 纪美影视在线观看电视版使用方法| 久久久久久久久蜜桃| 国产91成人video| 精品国产人妻一区二区三区| 91网址在线看| 欧美在线观看一区二区三区| 成人h动漫精品一区| 99精品在线免费| 97在线视频观看| a级一a一级在线观看| 97成人超碰视| 日韩av免费一区| 波多野结衣一本| 欧美极品另类videosde| 国产精品久久久久77777| 最近中文字幕免费| 国产精品久久久久久久浪潮网站 | 亚洲午夜电影在线| 国产精品yjizz| 中国一级特黄毛片| 欧美性生交片4| 国产对白在线播放| 丰满人妻妇伦又伦精品国产| 欧美大肚乱孕交hd孕妇| 国产不卡一区二区视频| 精品国产乱码久久久久久蜜臀网站| 亚洲国产精品悠悠久久琪琪 | 国产精品人人人人| 欧美在线观看一区| 亚洲国产精品日韩| 国产精品一区二区人人爽| 亚洲成人亚洲激情| 999香蕉视频| 国产综合色在线| 欧美激情在线观看视频| 亚洲无在线观看| 91免费国产在线| 日韩美女视频免费看| 九一在线免费观看| 国产午夜精品一区二区| 92福利视频午夜1000合集在线观看| 激情综合网五月天| 欧亚洲嫩模精品一区三区| 午夜久久久久久久久久久| 五月激情六月婷婷| 久久九九有精品国产23| 91视频啊啊啊| 亚洲人吸女人奶水| 你懂的视频在线一区二区| 一级α片免费看刺激高潮视频| 亚洲国产成人在线视频| 国产视频手机在线播放| av在线不卡网| 成人av在线亚洲| 狠狠人妻久久久久久综合| 日韩精品一区在线观看| 国产福利影院在线观看| 成人性生交大片免费| 国产精品久久久久久久美男| 青青草手机在线视频| 在线看不卡av| 阿v天堂2018| 久久久天天操| 久久久亚洲网站| 亚洲女优在线观看| 性感美女久久精品| 亚洲欧洲一区二区福利| 四虎免费在线观看| 久色乳综合思思在线视频| 99久久久久久久久久| 亚洲男人的天堂一区二区| 欧美日韩精品免费观看| 国产精品一区二区黑人巨大| 最近2019年日本中文免费字幕 | 亚洲永久精品大片| 色播五月综合| 久久久亚洲人| 久久久久免费视频| 午夜免费激情视频| 欧美无人高清视频在线观看| 国产97在线 | 亚洲| 蜜臀99久久精品久久久久小说 | 一区二区三区在线观看网站| 精品欧美国产| 亚洲av无码国产精品永久一区| 这里只有精品视频| 中文字幕一区二区久久人妻网站| 亚洲欧美激情插| 亚洲一区三区| 男女视频一区二区| 国产成人亚洲综合青青| 久久草视频在线| 亚洲国产小视频| 深夜视频在线观看| 亚洲成在人线免费| 黄色a级片免费看| 风间由美一区二区三区在线观看| 国产suv精品一区二区| 中文字幕视频网| 精品成人在线观看| 野战少妇38p| 亚洲一级在线观看| 国产精彩视频一区二区| 成人av中文字幕| 亚洲最大的网站| 国产伦精品一区二区三区视频痴汉 | 91l九色lporny| 91高清在线观看| 日韩欧美国产免费| 国产人伦精品一区二区| 国产伦一区二区三区色一情| 黑人精品一区二区| 97色在线观看| 亚洲国产精品无码久久久| 日韩成人在线免费观看| 日本xxx在线播放| 精品日本美女福利在线观看| 免费黄色日本网站| 91亚洲精品久久久蜜桃网站| 久久99精品国产99久久| 亚洲乱码国产乱码精品精软件| 久久理论片午夜琪琪电影网| 国产日产精品一区二区三区的介绍| 欧美一区二区不卡视频| 91丨九色丨蝌蚪| 亚洲制服丝袜一区| 97免费视频观看| 久久久久久久久岛国免费| 久久99精品久久久久久久青青日本 | 一级性生活免费视频| 欧美日韩黄色一区二区| 国产精品igao网网址不卡| 夜夜嗨av一区二区三区| 精品这里只有精品| 国产女同性恋一区二区| 亚洲成年人专区| 99久久精品一区二区| 日韩资源av在线| 国产精品一区二区久激情瑜伽| 国产综合 伊人色| 天天综合在线视频| 国产中文字幕亚洲| 国产视频第二页| 欧洲亚洲女同hd| 天天爱天天做天天爽| 另类天堂视频在线观看| 国产老头老太做爰视频| 亚洲第一福利在线观看| 人妻少妇精品视频一区二区三区| 欧美熟乱第一页| 久草免费资源站| 欧美日韩综合色| 亚洲av无码专区在线播放中文| 色婷婷亚洲婷婷| 熟妇女人妻丰满少妇中文字幕| 疯狂做受xxxx高潮欧美日本| 日韩高清第一页| 婷婷国产v国产偷v亚洲高清| 欧美日韩一区二区三区69堂| 亚洲福利一二三区| 奇米视频888| 亚洲自拍与偷拍| 韩国日本美国免费毛片| 中文字幕亚洲精品在线观看| 丁香花在线影院观看在线播放 | 中文字幕不卡的av| 福利在线一区二区| 亚洲天堂av一区| 中国丰满人妻videoshd| 一区二区三区中文在线| 不要播放器的av网站| 亚洲v日本v欧美v久久精品| 欧美日韩亚洲自拍| 色偷偷久久人人79超碰人人澡| 亚洲小视频网站| 欧美日韩中文精品| 国产中文字幕一区二区| 精品久久一区二区三区| 欧美亚洲色综久久精品国产| 日韩第一页在线| 国产精品一区二区亚洲| 亚洲欧美精品伊人久久| 精品亚洲乱码一区二区| 在线观看国产欧美| 少妇aaaaa| www高清在线视频日韩欧美| 中文字幕国产在线观看| 亚州国产精品久久久| 精品国产va久久久久久久| 91久久国产精品91久久性色| 日本成人在线电影网| 久久精品国产99精品国产亚洲性色| 成人一区二区三区| 三年中国中文在线观看免费播放| 国产精品成人在线观看| 国产xxxxx视频| 在线精品视频一区二区| 中文成人无字幕乱码精品区| 精品精品欲导航| 久久精品一区二区三区四区五区| 日韩在线观看av| 一区二区三区精| 成人免费看片视频| 国产精品一区二区三区乱码|