真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言中文圖書 go語言的書

golang配制高性能sql.DB

有很多教程是關于Go的sql.DB類型和如何使用它來執(zhí)行SQL數(shù)據(jù)庫查詢的。但大多數(shù)內(nèi)容都沒有講述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它們來配置sql.DB的行為并改變其性能。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供濰坊網(wǎng)站建設、濰坊做網(wǎng)站、濰坊網(wǎng)站設計、濰坊網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、濰坊企業(yè)網(wǎng)站模板建站服務,十余年濰坊做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

轉自:

整理:go語言中文文檔:

在本文我將詳細解釋這些設置的作用,并說明它們所能產(chǎn)生的(積極和消極)影響。

一個sql.DB對象就是一個數(shù)據(jù)庫連接池,它包含“正在用”和“空閑的”連接。一個正在用的連接指的是,你正用它來執(zhí)行數(shù)據(jù)庫任務,例如執(zhí)行SQL語句或行查詢。當任務完成連接就是空閑的。

當您創(chuàng)建sql.DB執(zhí)行數(shù)據(jù)庫任務時,它將首先檢查連接池中是否有可用的空閑連接。如果有可用的連接,那么Go將重用現(xiàn)有連接,并在執(zhí)行任務期間將其標記為正在使用。如果池中沒有空閑連接,而您需要一個空閑連接,那么Go將創(chuàng)建一個新的連接。

默認情況下,在同一時間打開連接的數(shù)量是沒有限制(包含使用中+空閑)。但你可以通過SetMaxOpenConns()方法實現(xiàn)自定義限制,如下所示:

在這個示例代碼中,連接池現(xiàn)在有5個并發(fā)打開的連接數(shù)。如果所有5個連接都已經(jīng)被標記為正在使用,并且需要另一個新的連接,那么應用程序將被迫等待,直到5個連接中的一個被釋放并變?yōu)榭臻e。

為了說明更改MaxOpenConns的影響,我運行了一個基準測試,將最大打開連接數(shù)設置為1、2、5、10和無限?;鶞蕼y試在PostgreSQL數(shù)據(jù)庫上執(zhí)行并行的INSERT語句,您可以在這里找到代碼。測試結果:

對于這個基準測試,我們可以看到,允許打開的連接越多,在數(shù)據(jù)庫上執(zhí)行INSERT操作所花費的時間就越少(打開的連接數(shù)為1時,執(zhí)行速度3129633ns/op,而無限連接:531030ns/op——大約快了6倍)。這是因為允許打開的連接越多,可以并發(fā)執(zhí)行的數(shù)據(jù)庫查詢就越多。

默認情況下,sql.DB允許連接池中最多保留2個空閑連接。你可以通過SetMaxIdleConns()方法改變它,如下所示:

從理論上講,允許池中有更多的空閑連接將提高性能,因為這樣就不太可能從頭開始建立新連接——因此有助于提升數(shù)據(jù)庫性能。

讓我們來看看相同的基準測試,最大空閑連接設置為none, 1,2,5和10:

當MaxIdleConns設置為none時,必須為每個INSERT從頭創(chuàng)建一個新的連接,我們可以從基準測試中看到,平均運行時和內(nèi)存使用量相對較高。

只允許保留和重用一個空閑連接對基準測試影響特別明顯——它將平均運行時間減少了大約8倍,內(nèi)存使用量減少了大約20倍。繼續(xù)增加空閑連接池的大小會使性能變得更好,盡管改進并不明顯。

那么,您應該維護一個大的空閑連接池嗎?答案取決于應用程序。重要的是要意識到保持空閑連接是有代價的—它占用了可以用于應用程序和數(shù)據(jù)庫的內(nèi)存。

還有一種可能是,如果一個連接空閑時間太長,那么它可能會變得不可用。例如,MySQL的wait_timeout設置將自動關閉任何8小時(默認)內(nèi)未使用的連接。

當發(fā)生這種情況時,sql.DB會優(yōu)雅地處理它。壞連接將自動重試兩次,然后放棄,此時Go將該連接從連接池中刪除,并創(chuàng)建一個新的連接。因此,將MaxIdleConns設置得太大可能會導致連接變得不可用,與空閑連接池更小(使用更頻繁的連接更少)相比,會占有更多的資源。所以,如果你很可能很快就會再次使用,你只需保持一個空閑的連接。

最后要指出的是,MaxIdleConns應該總是小于或等于MaxOpenConns。Go強制執(zhí)行此操作,并在必要時自動減少MaxIdleConns。

現(xiàn)在讓我們看看SetConnMaxLifetime()方法,它設置連接可重用的最大時間長度。如果您的SQL數(shù)據(jù)庫也實現(xiàn)了最大連接生命周期,或者—例如—您希望方便地在負載均衡器后交換數(shù)據(jù)庫,那么這將非常有用。

你可以這樣使用它:

在這個例子中,所有的連接都將在創(chuàng)建后1小時“過期”,并且在過期后無法重用。但注意:

從理論上講,ConnMaxLifetime越短,連接過期的頻率就越高——因此,需要從頭創(chuàng)建連接的頻率就越高。為了說明這一點,我運行了將ConnMaxLifetime設置為100ms、200ms、500ms、1000ms和無限(永遠重用)的基準測試,默認設置為無限打開連接和2個空閑連接。這些時間段顯然比您在大多數(shù)應用程序中使用的時間要短得多,但它們有助于很好地說明行為。

在這些特定的基準測試中,我們可以看到,與無限生存期相比,在100ms生存期時內(nèi)存使用量增加了3倍以上,而且每個INSERT的平均運行時也稍微長一些。

如果您在代碼中設置了ConnMaxLifetime,那么一定要記住連接將過期(隨后重新創(chuàng)建)的頻率。例如,如果您總共有100個連接,而ConnMaxLifetime為1分鐘,那么您的應用程序可能每秒鐘殺死和重新創(chuàng)建1.67個連接(平均值)。您不希望這個頻率太大,最終會阻礙性能,而不是提高性能。

最后,如果不說明超過數(shù)據(jù)庫連接數(shù)量的硬限制將會發(fā)生什么,那么本文就不完整了。 為了說明這一點,我將修改postgresql.conf文件,這樣總共只允許5個連接(默認是100個)…

然后在無限連接的情況下重新運行基準測試……

一旦達到5個連接的硬限制,數(shù)據(jù)庫驅動程序(pq)立即返回一個太多客戶端連接的錯誤消息,而無法完成INSERT。為了防止這個錯誤,我們需要將sql.DB中打開連接的最大總數(shù)(正在使用的+空閑的)設置為低于5。像這樣:

現(xiàn)在,sql.DB在任何時候最多只能創(chuàng)建3個連接,基準測試運行時應該不會出現(xiàn)任何錯誤。但是這樣做需要注意:當達到開放連接數(shù)限制,并且所有連接都在使用時,應用程序需要執(zhí)行的任何新的數(shù)據(jù)庫任務都將被迫等待,直到連接標記為空閑。例如,在web應用程序的上下文中,用戶的HTTP請求看起來會“掛起”,甚至在等待數(shù)據(jù)庫任務運行時可能會超時。

為了減輕這種情況,你應該始終在一個上下文中傳遞。在調(diào)用數(shù)據(jù)庫時,啟用上下文的方法(如ExecContext()),使用固定的、快速的超時上下文對象。

總結

1、根據(jù)經(jīng)驗,應該顯式設置MaxOpenConns值。這應該小于數(shù)據(jù)庫和基礎設施對連接數(shù)量的硬性限制。

2、一般來說,更高的MaxOpenConns和MaxIdleConns值將帶來更好的性能。但你應該注意到效果是遞減的,連接池空閑連接太多(連接沒有被重用,最終會變壞)實際上會導致性能下降。

3、為了降低上面第2點帶來的風險,您可能需要設置一個相對較短的ConnMaxLifetime。但你也不希望它太短,導致連接被殺死或不必要地頻繁重建。

4、MaxIdleConns應該總是小于或等于MaxOpenConns。

對于中小型web應用程序,我通常使用以下設置作為起點,然后根據(jù)實際吞吐量水平的負載測試結果進行優(yōu)化。

go語言簡體中文編碼包怎么用

二進制包安裝的話:如果安裝在了默認位置例如/usr/local/go (Windows系統(tǒng):c:\Go)這個時候可以不需要設置GOROOT,如果改變了安裝的這個默認目錄,那么就需要設置GOROOT

GOROOT的概念有點Go安裝目錄的意思

GOPATH是一個開發(fā)環(huán)境目錄的意思,下面必須包含bin、pkg、src,然后再src下面新建項目就可以了

你在沒有設置GOPATH的情況下,也可以把項目建在GOROOT/src下面,其實和GOPATH的概念類似

《Go程序設計語言中文版》pdf下載在線閱讀全文,求百度網(wǎng)盤云資源

《Go程序設計語言中文版》百度網(wǎng)盤pdf最新全集下載:

鏈接:

?pwd=0cii 提取碼:0cii

簡介:本書由《C程序設計語言》的作者Kernighan和谷歌公司Go團隊主管Alan Donovan聯(lián)袂撰寫,是學習Go語言程序設計的指南。本書共13章,主要內(nèi)容包括:Go的基礎知識、基本結構、

基本數(shù)據(jù)類型、復合數(shù)據(jù)類型、函數(shù)、方法、接口、goroutine、通道、共享變量的并發(fā)性、包、go工具、測試、反射等。

本書適合作為計算機相關專業(yè)的教材,也可供Go語言愛好者閱讀?

GitHub 上有哪些值得推薦的開源電子書

語言無關類

操作系統(tǒng)

鳥哥的Linux私房菜 (簡體)

Linux 系統(tǒng)高級編程

The Linux Command Line (中英文版)

Linux 設備驅動 (第三版)

深入分析Linux內(nèi)核源碼

UNIX TOOLBOX

Docker中文指南

Docker —— 從入門到實踐

FreeRADIUS新手入門

Mac 開發(fā)配置手冊

FreeBSD 使用手冊

Linux 命令行(中文版)

智能系統(tǒng)

一步步搭建物聯(lián)網(wǎng)系統(tǒng)

web服務器

Nginx開發(fā)從入門到精通 (淘寶團隊出品)

版本控制

Git教程 (本文由 ?@廖雪峰 創(chuàng)作,如果覺得本教程對您有幫助,可以去 ?iTunes 購買)

git – 簡易指南

猴子都能懂的GIT入門

Git 參考手冊

Pro Git

Git Magic

GotGitHub

Git Community Book 中文版

Mercurial 使用教程

HgInit (中文版)

沉浸式學 Git

Git-Cheat-Sheet (感謝 @flyhigher139 翻譯了中文版)

GitHub秘籍

NoSQL

NoSQL數(shù)據(jù)庫筆談 (PDF)

Redis 設計與實現(xiàn)

Redis 命令參考

帶有詳細注釋的 Redis 3.0 代碼

帶有詳細注釋的 Redis 2.6 代碼

The Little MongoDB Book

The Little Redis Book

Neo4j 簡體中文手冊 v1.8

Neo4j .rb 中文資源

MySQL

MySQL索引背后的數(shù)據(jù)結構及算法原理

項目相關

持續(xù)集成(第二版) (譯言網(wǎng))

讓開發(fā)自動化系列專欄

追求代碼質量

selenium 中文文檔

Joel談軟件

約耳談軟體(Joel on Software)

Web

關于瀏覽器和網(wǎng)絡的 20 項須知

前端知識體系

瀏覽器開發(fā)工具的秘密

Chrome 開發(fā)者工具中文手冊

Chrome擴展開發(fā)文檔

Grunt中文文檔

移動Web前端知識庫

正則表達式30分鐘入門教程

前端開發(fā)體系建設日記

移動前端開發(fā)收藏夾

JSON風格指南

HTTP 接口設計指北

前端資源分享(一)

前端資源分享(二)

前端代碼規(guī)范 及 最佳實踐

w3school教程整理

大數(shù)據(jù)

大數(shù)據(jù)/數(shù)據(jù)挖掘/推薦系統(tǒng)/機器學習相關資源

編程藝術

程序員編程藝術

每個程序員都應該了解的內(nèi)存知識(譯)【第一部分】

取悅的工序:如何理解游戲 (豆瓣閱讀,免費書籍)

其他

OpenWrt智能、自動、透明翻墻路由器教程

語言相關類 AWK

awk程序設計語言

C/C++

C++ 并發(fā)編程指南 (@傅海平ICT)

Linux C編程一站式學習 (宋勁杉, 北京亞嵌教育研究中心)

CGDB中文手冊

100個gdb小技巧

100個gcc小技巧

ZMQ 指南

How to Think Like a Computer Scientist (中英文版)

跟我一起寫Makefile(PDF)

GNU make中文手冊

GNU make 指南

Google C++ 風格指南

C/C++ Primer (by @andycai)

簡單易懂的C魔法

Cmake 實踐 (PDF版)

C++ FAQ LITE(中文版)

C++ Primer 5th Answers

CSS/HTML

學習CSS布局

通用 CSS 筆記、建議與指導

CSS參考手冊

Emmet 文檔

前端代碼規(guī)范 (騰訊alloyteam團隊)

Dart

Dart 語言導覽

Fortran

Fortran77和90/95編程入門

Java

實時 Java 系列

Apache Shiro 用戶指南

使用 Eclipse 和 Java SE 6 創(chuàng)建獨立 Web Services 應用程序

第 1 部分: Web Services 服務端應用程序

第 2 部分: Web 服務客戶端應用程序

JavaServer Faces 1.2 入門

第 1 部分: 構建基本應用程序

第 2 部分: JSF 生命周期、轉換、檢驗和階段監(jiān)聽器

用 Eclipse Europa 進行 Web 開發(fā)

第 1 部分: Eclipse Java EE

第 2 部分: PHP 開發(fā)工具

第 3 部分: Ruby Development Toolkit 和 RadRails

使用 JavaServer Faces 構建 Apache Geronimo 應用程序

第 1 部分: 使用 Eclipse 和 Apache MyFaces Core 構建基本的應用程序

第 2 部分: 在 JavaServer Faces 中使用 Tomahawk

第 3 部分: 使用 ajax4jsf 添加 Ajax 功能

第 4 部分: 使用 Apache Trinidad 組件擴展 JSF

第 5 部分: 將 JSF 應用程序與 Spring 集成

Apache Geronimo 和 Spring 框架

第 1 部分: 開發(fā)方法學

第 2 部分: 構建第一個應用程序

第 3 部分: 集成 DAO 與 ORM

第 4 部分: 混合使用 Spring AOP 和 Spring Web Flow

第 5 部分: Spring MVC

第 6 部分: Spring MVC:使用 Web 視圖技術

終極 mashup —— Web 服務和語義 Web

第 1 部分: 使用與組合 Web 服務

第 2 部分: 管理 Mashup 數(shù)據(jù)緩存

第 3 部分: 理解 RDF 和 RDFs

第 4 部分: 創(chuàng)建本體

第 5 部分: 切換 Web 服務

Jersey 2.x 用戶指南

MyBatis中文文檔

JavaScript

Google JavaScript 代碼風格指南

Airbnb JavaScript 規(guī)范

JavaScript 標準參考教程(alpha)

Javascript編程指南 (源碼)

javascript 的 12 個怪癖

JavaScript 秘密花園

JavaScript核心概念及實踐 (PDF) (此書已由人民郵電出版社出版發(fā)行,但作者依然免費提供PDF版本,希望開發(fā)者們?nèi)ベ徺I,支持作者)

《JavaScript 模式》翻譯,此書中文版有售,但是紙質書翻譯的還沒有這個版本翻譯的好

命名函數(shù)表達式探秘 (注:原文由為之漫筆翻譯,原始地址無法打開,所以此處地址為我博客上的備份)

學用 JavaScript 設計模式 (開源中國)

深入理解JavaScript系列

ECMAScript 6 入門 (作者:阮一峰)

jQuery

jQuery 解構

簡單易懂的JQuery魔法

How to write jQuery plugin

Node.js

Node入門

七天學會NodeJS

Nodejs Wiki Book (繁體中文)

express.js 中文文檔

koa 中文文檔

使用 Express + MongoDB 搭建多人博客

Express框架

nodejs文檔

Node.js 包教不包會

Learn You The Node.js For Much Win! (中文版)

Node debug 三法三例

underscore.js

Underscore.js中文文檔

backbone.js

backbone.js入門教程 (PDF)

Backbone.js入門教程第二版

Developing Backbone.js Applications(中文版)

AngularJS

AngularJS最佳實踐和風格指南

AngularJS中譯本

AngularJS入門教程

構建自己的AngularJS

在Windows環(huán)境下用Yeoman構建AngularJS項目

zepto 簡明中文手冊

Sea.js

Hello Sea.js

CoffeeScript

CoffeeScript Cookbook

The Little Book on CoffeeScript中文版

ExtJS

Ext4.1.0 中文文檔

Chrome擴展及應用開發(fā)

JavaScript入門教程

PHP

PHP調(diào)試技術手冊(PDF)

XDebug 2中文手冊(譯) (CHM)

PHP之道

PHP 最佳實踐

PHP安全最佳實踐

深入理解PHP內(nèi)核

PHP擴展開發(fā)及內(nèi)核應用

CodeIgniter 用戶指南

Laravel4 中文文檔

Laravel 入門

Symfony2中文文檔 (未譯完)

Phalcon中文文檔(翻譯進行中)

YiiBook幾本Yii框架的在線教程

簡單易懂的PHP魔法

swoole文檔及入門教程

iOS

iOS開發(fā)60分鐘入門

iOS7人機界面指南

Google Objective-C Style Guide 中文版

iPhone 6 屏幕揭秘

Apple Watch開發(fā)初探

馬上著手開發(fā) iOS 應用程序

網(wǎng)易斯坦福大學公開課:iOS 7應用開發(fā)字幕文件

Android

Android Design(中文版)

Google Android官方培訓課程中文版

Android學習之路

Python

小白的Python教程

簡明Python教程

零基礎學Python

Python 2.7 官方教程中文版

Python 3.3 官方教程中文版

深入 Python 3

PEP8 Python代碼風格規(guī)范

Google Python 風格指南 中文版

Python入門教程 (PDF)

Python的神奇方法指南

笨辦法學 Python (PDF版下載)

Django 文檔中文版

Django 最佳實踐

The Django Book 中文版

web.py 0.3 新手指南

Web.py Cookbook 簡體中文版

Dive Into Python 中文版

Bottle 文檔中文版 (需翻墻)

Flask 文檔中文版

Jinja2 文檔中文版

Werkzeug 文檔中文版

Flask之旅

Introduction to Tornado 中文翻譯

Python自然語言處理中文版 (感謝陳濤同學的翻譯,也謝謝 ?@shwley 聯(lián)系了作者)

Python 繪圖庫 matplotlib 官方指南中文翻譯

Scrapy 0.25 文檔

ThinkPython

Ruby

Ruby 風格指南

Rails 風格指南

笨方法學 Ruby

Ruby on Rails 指南

Ruby on Rails 實戰(zhàn)圣經(jīng)

Ruby on Rails Tutorial 原書第 2 版 (本書網(wǎng)頁版免費提供,電子版以 PDF、EPub 和 Mobi 格式提供購買,僅售 9.9 美元)

編寫Ruby的C拓展

Ruby 源碼解讀

Shell

Shell腳本編程30分鐘入門

Go

Go編程基礎

Go入門指南

學習Go語言 (PDF)

Go Web 編程 (此書已經(jīng)出版,希望開發(fā)者們?nèi)ベ徺I,支持作者的創(chuàng)作)

Go實戰(zhàn)開發(fā) (當我收錄此項目時,作者已經(jīng)寫完第三章,如果讀完前面章節(jié)覺得有幫助,可以給作者捐贈,以鼓勵作者的繼續(xù)創(chuàng)作)

Network programming with Go 中文翻譯版本

Groovy

實戰(zhàn) Groovy 系列

LaTeX

一份其實很短的 LaTeX 入門文檔

一份不太簡短的 LATEX 2ε 介紹 (PDF版)

LISP

ANSI Common Lisp 中文翻譯版

Lua

Lua編程入門

Haskell

Real World Haskell 中文版

R

R語言忍者秘笈

Scala

Scala課堂 (Twitter的Scala中文教程)

Effective Scala(Twitter的Scala最佳實踐的中文翻譯)

Scala指南

Swift

The Swift Programming Language 中文版

Perl

Modern Perl 中文版

Perl 程序員應該知道的事

Prolog

笨辦法學Prolog

Vim中文文檔

Vimscript

笨方法學Vimscript 中譯本

Vim中文文檔

讀書筆記及其它 讀書筆記

編譯原理(紫龍書)中文第2版習題答案

把《編程珠璣》讀薄

Effective C++讀書筆記

Golang 學習筆記、Python 學習筆記、C 學習筆記 (PDF)

Jsoup 學習筆記

學習筆記: Vim、Python、memcached

圖靈開放書翻譯計劃–C++、Python、Java等

蒂姆·奧萊利隨筆 (由譯言網(wǎng)翻譯,電子版免費)

Octave 入門 (PDF版)

SICP 解題集

精彩博客集合

正則表達式簡明參考

《Go語言實戰(zhàn)》epub下載在線閱讀全文,求百度網(wǎng)盤云資源

《Go語言實戰(zhàn)》(威廉·肯尼迪(WilliamKennedy)布賴恩·克特森(BrianKetelsen)埃里克·圣馬丁(ErikSt.Martin)? )電子書網(wǎng)盤下載免費在線閱讀

鏈接:

提取碼:xbxw ?

書名:Go語言實戰(zhàn)

豆瓣評分:7.7

作者:?威廉·肯尼迪 (William Kennedy)?/?布賴恩·克特森 (Brian Ketelsen)?/?埃里克·圣馬丁 (Erik St.Martin)

出版社:?人民郵電出版社

出品方:?異步圖書

譯者:?李兆海

出版年:?2017-3-1

頁數(shù):?224

內(nèi)容簡介

Go語言結合了底層系統(tǒng)語言的能力以及現(xiàn)代語言的高級特性,旨在降低構建簡單、可靠、高效軟件的門檻。本書向讀者提供一個專注、全面且符合語言習慣的視角。Go語言實戰(zhàn)同時關注語言的規(guī)范和實現(xiàn),涉及的內(nèi)容包括語法、類型系統(tǒng)、并發(fā)、管道、測試,以及其他一些主題。

作者簡介

William Kennedy,是一位熟練的軟件開發(fā)者,也是博客GoingGo.Net的作者。

Brian Ketelsen和Erik St. Martin是全球Go語言大會GopherCon的組織者,也是Go語言框架Skynet的聯(lián)合作者。

李兆海,多年專注于后端分布式網(wǎng)絡服務開發(fā),曾使用過多個流行后端技術和相關架構實踐,是Go語言和Docker的早期使用者和推廣者,《第1本Docker書》的譯者。作為項目技術負責人,成功開發(fā)了百萬用戶級直播系統(tǒng)。

Go語言之Context

golang在1.6.2的時候還沒有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的庫中。中文譯作“上下文”,它主要包含了goroutine 的運行狀態(tài)、環(huán)境等信息。

context 主要用來在 goroutine 之間傳遞上下文信息,包括:同步信號、超時時間、截止時間、請求相關值等。

該接口定義了四個需要實現(xiàn)的方法:

如果有個網(wǎng)絡請求Request,然后這個請求又可以開啟多個goroutine做一些事情,當這個網(wǎng)絡請求出現(xiàn)異常和超時時,這個請求結束了,這時候就可以通過context來跟蹤這些goroutine,并且通過Context來取消他們,然后系統(tǒng)才可回收所占用的資源。

為了更方便的創(chuàng)建Context,包里頭定義了Background來作為所有Context的根,它是一個emptyCtx的實例。

Background返回一個非空的Context。它永遠不會被取消。它通常用來初始化和測試使用,作為一個頂層的context,也就是說一般我們創(chuàng)建的context都是基于Background。

TODO返回一個非空的Context。當不清楚要使用哪個上下文的時候可以使用TODO。

他們兩個本質上都是emptyCtx結構體類型,是一個不可取消,沒有設置截止時間,沒有攜帶任何值的Context。

有了如上的根Context,那么是如何衍生更多的子Context的呢?這就要靠context包為我們提供的With系列的函數(shù)了。

通過這些函數(shù),就創(chuàng)建了一顆Context樹,樹的每個節(jié)點都可以有任意多個子節(jié)點,節(jié)點層級可以有任意多個。

WithCancel函數(shù),最常用的派生 context 方法。該方法接受一個父 context。父 context 可以是一個 background context 或其他 context。

WithDeadline函數(shù),該方法會創(chuàng)建一個帶有 deadline 的 context。當 deadline 到期后,該 context 以及該 context 的可能子 context 會受到 cancel 通知。另外,如果 deadline 前調(diào)用 cancelFunc 則會提前發(fā)送取消通知。

WithTimeout和WithDeadline基本上一樣,這個表示是超時自動取消,是多少時間后自動取消Context的意思。

WithValue函數(shù)和取消Context無關,它是為了生成一個綁定了一個鍵值對數(shù)據(jù)的Context,這個綁定的數(shù)據(jù)可以通過Context.Value方法訪問到,一般我們想要通過上下文來傳遞數(shù)據(jù)時,可以通過這個方法,如我們需要tarce追蹤系統(tǒng)調(diào)用棧的時候。

使用Context的程序應遵循以下規(guī)則,以使各個包之間的接口保持一致:

1.不要將 Context 塞到結構體里。直接將 Context 類型作為函數(shù)的第一參數(shù),而且一般都命名為 ctx。

2.不要向函數(shù)傳入一個 nil 的 context,如果你實在不知道傳什么,標準庫給你準備好了一個 context:todo。

3.不要把本應該作為函數(shù)參數(shù)的類型塞到 context 中,context 存儲的應該是一些共同的數(shù)據(jù)。例如:登陸的 session、cookie 等。

4.同一個 context 可能會被傳遞到多個 goroutine,別擔心,context 是并發(fā)安全的。


網(wǎng)頁題目:go語言中文圖書 go語言的書
當前網(wǎng)址:http://weahome.cn/article/hgjodd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部