mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.boringcrypto] all: merge master into dev.boringcrypto
Change-Id: I2dcec316fd08d91db4183fb9d3b9afde65cc248f
This commit is contained in:
commit
e067ce5225
1724 changed files with 166718 additions and 233768 deletions
6
.gitattributes
vendored
6
.gitattributes
vendored
|
|
@ -8,3 +8,9 @@
|
||||||
# See golang.org/issue/9281
|
# See golang.org/issue/9281
|
||||||
|
|
||||||
* -text
|
* -text
|
||||||
|
|
||||||
|
# The only exception is Windows files that must absolutely be CRLF or
|
||||||
|
# might not work. Batch files are known to have multiple bugs when run
|
||||||
|
# with LF endings. See golang.org/issue/37791 for more information.
|
||||||
|
|
||||||
|
*.bat text eol=crlf
|
||||||
|
|
|
||||||
6
.github/ISSUE_TEMPLATE
vendored
6
.github/ISSUE_TEMPLATE
vendored
|
|
@ -1,4 +1,7 @@
|
||||||
<!-- Please answer these questions before submitting your issue. Thanks! -->
|
<!--
|
||||||
|
Please answer these questions before submitting your issue. Thanks!
|
||||||
|
For questions please use one of our forums: https://github.com/golang/go/wiki/Questions
|
||||||
|
-->
|
||||||
|
|
||||||
### What version of Go are you using (`go version`)?
|
### What version of Go are you using (`go version`)?
|
||||||
|
|
||||||
|
|
@ -33,4 +36,3 @@ A link on play.golang.org is best.
|
||||||
|
|
||||||
|
|
||||||
### What did you see instead?
|
### What did you see instead?
|
||||||
|
|
||||||
|
|
|
||||||
148
CONTRIBUTORS
148
CONTRIBUTORS
|
|
@ -25,6 +25,8 @@
|
||||||
# Please keep the list sorted.
|
# Please keep the list sorted.
|
||||||
|
|
||||||
Aamir Khan <syst3m.w0rm@gmail.com>
|
Aamir Khan <syst3m.w0rm@gmail.com>
|
||||||
|
Aaron Beitch <aaronb@arista.com>
|
||||||
|
Aaron Bieber <deftly@gmail.com>
|
||||||
Aaron Cannon <cannona@fireantproductions.com>
|
Aaron Cannon <cannona@fireantproductions.com>
|
||||||
Aaron France <aaron.l.france@gmail.com>
|
Aaron France <aaron.l.france@gmail.com>
|
||||||
Aaron Jacobs <jacobsa@google.com>
|
Aaron Jacobs <jacobsa@google.com>
|
||||||
|
|
@ -44,10 +46,13 @@ Adam Kisala <adam.kisala@gmail.com>
|
||||||
Adam Langley <agl@golang.org>
|
Adam Langley <agl@golang.org>
|
||||||
Adam Medzinski <adam.medzinski@gmail.com>
|
Adam Medzinski <adam.medzinski@gmail.com>
|
||||||
Adam Shannon <adamkshannon@gmail.com>
|
Adam Shannon <adamkshannon@gmail.com>
|
||||||
|
Adam Shelton <aashelt90@gmail.com>
|
||||||
Adam Sindelar <adamsh@google.com>
|
Adam Sindelar <adamsh@google.com>
|
||||||
Adam Thomason <athomason@gmail.com>
|
Adam Thomason <athomason@gmail.com>
|
||||||
|
Adam Williams <pwnfactory@gmail.com>
|
||||||
Adam Woodbeck <adam@woodbeck.net>
|
Adam Woodbeck <adam@woodbeck.net>
|
||||||
Adarsh Ravichandran <adarshravichandran91@gmail.com>
|
Adarsh Ravichandran <adarshravichandran91@gmail.com>
|
||||||
|
Aditya Harindar <aditya.harindar@gmail.com>
|
||||||
Aditya Mukerjee <dev@chimeracoder.net>
|
Aditya Mukerjee <dev@chimeracoder.net>
|
||||||
Adrian Hesketh <adrianhesketh@hushmail.com>
|
Adrian Hesketh <adrianhesketh@hushmail.com>
|
||||||
Adrian Nos <nos.adrian@gmail.com>
|
Adrian Nos <nos.adrian@gmail.com>
|
||||||
|
|
@ -81,6 +86,7 @@ Albert Yu <yukinying@gmail.com>
|
||||||
Alberto Bertogli <albertito@blitiri.com.ar>
|
Alberto Bertogli <albertito@blitiri.com.ar>
|
||||||
Alberto Donizetti <alb.donizetti@gmail.com>
|
Alberto Donizetti <alb.donizetti@gmail.com>
|
||||||
Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
|
Alberto García Hierro <alberto@garciahierro.com> <alberto.garcia.hierro@gmail.com>
|
||||||
|
Alec Benzer <alec.benzer@gmail.com>
|
||||||
Aleksa Sarai <cyphar@cyphar.com>
|
Aleksa Sarai <cyphar@cyphar.com>
|
||||||
Aleksandar Dezelin <dezelin@gmail.com>
|
Aleksandar Dezelin <dezelin@gmail.com>
|
||||||
Aleksandr Lukinykh <a.lukinykh@xsolla.com>
|
Aleksandr Lukinykh <a.lukinykh@xsolla.com>
|
||||||
|
|
@ -92,7 +98,10 @@ Alex A Skinner <alex@lx.lc>
|
||||||
Alex Brainman <alex.brainman@gmail.com>
|
Alex Brainman <alex.brainman@gmail.com>
|
||||||
Alex Bramley <abramley@google.com>
|
Alex Bramley <abramley@google.com>
|
||||||
Alex Browne <stephenalexbrowne@gmail.com>
|
Alex Browne <stephenalexbrowne@gmail.com>
|
||||||
|
Alex Buchanan <buchanae@gmail.com>
|
||||||
Alex Carol <alex.carol.c@gmail.com>
|
Alex Carol <alex.carol.c@gmail.com>
|
||||||
|
Alex Gaynor <alex@alloy.us>
|
||||||
|
Alex Harford <alex.harford@saucelabs.com>
|
||||||
Alex Jin <toalexjin@gmail.com>
|
Alex Jin <toalexjin@gmail.com>
|
||||||
Alex Kohler <alexjohnkohler@gmail.com>
|
Alex Kohler <alexjohnkohler@gmail.com>
|
||||||
Alex Myasoedov <msoedov@gmail.com>
|
Alex Myasoedov <msoedov@gmail.com>
|
||||||
|
|
@ -101,6 +110,7 @@ Alex Schroeder <alex@gnu.org>
|
||||||
Alex Sergeyev <abc@alexsergeyev.com>
|
Alex Sergeyev <abc@alexsergeyev.com>
|
||||||
Alex Tokarev <aleksator@gmail.com>
|
Alex Tokarev <aleksator@gmail.com>
|
||||||
Alex Vaghin <crhyme@google.com>
|
Alex Vaghin <crhyme@google.com>
|
||||||
|
Alex Zhirov <azhirov@google.com>
|
||||||
Alexander Demakin <alexander.demakin@gmail.com>
|
Alexander Demakin <alexander.demakin@gmail.com>
|
||||||
Alexander Döring <email@alexd.ch>
|
Alexander Döring <email@alexd.ch>
|
||||||
Alexander F Rødseth <alexander.rodseth@appeartv.com>
|
Alexander F Rødseth <alexander.rodseth@appeartv.com>
|
||||||
|
|
@ -121,6 +131,7 @@ Alexander Surma <surma@surmair.de>
|
||||||
Alexander Zhavnerchik <alex.vizor@gmail.com>
|
Alexander Zhavnerchik <alex.vizor@gmail.com>
|
||||||
Alexander Zillion <alex@alexzillion.com>
|
Alexander Zillion <alex@alexzillion.com>
|
||||||
Alexander Zolotov <goldifit@gmail.com>
|
Alexander Zolotov <goldifit@gmail.com>
|
||||||
|
Alexandr Mayorskiy <a.mayorskiy@corp.mail.ru>
|
||||||
Alexandre Cesaro <alexandre.cesaro@gmail.com>
|
Alexandre Cesaro <alexandre.cesaro@gmail.com>
|
||||||
Alexandre Fiori <fiorix@gmail.com>
|
Alexandre Fiori <fiorix@gmail.com>
|
||||||
Alexandre Maari <draeron@gmail.com>
|
Alexandre Maari <draeron@gmail.com>
|
||||||
|
|
@ -147,6 +158,7 @@ Aman Gupta <aman@tmm1.net>
|
||||||
Amir Mohammad Saied <amir@gluegadget.com>
|
Amir Mohammad Saied <amir@gluegadget.com>
|
||||||
Amr Mohammed <merodiro@gmail.com>
|
Amr Mohammed <merodiro@gmail.com>
|
||||||
Amrut Joshi <amrut.joshi@gmail.com>
|
Amrut Joshi <amrut.joshi@gmail.com>
|
||||||
|
An Xiao <hac@zju.edu.cn>
|
||||||
Anand K. Mistry <anand@mistry.ninja>
|
Anand K. Mistry <anand@mistry.ninja>
|
||||||
Anders Pearson <anders@columbia.edu>
|
Anders Pearson <anders@columbia.edu>
|
||||||
Anderson Queiroz <contato@andersonq.eti.br>
|
Anderson Queiroz <contato@andersonq.eti.br>
|
||||||
|
|
@ -157,6 +169,7 @@ Andrea Spadaccini <spadaccio@google.com>
|
||||||
Andreas Auernhammer <aead@mail.de>
|
Andreas Auernhammer <aead@mail.de>
|
||||||
Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
|
Andreas Jellinghaus <andreas@ionisiert.de> <anj@google.com>
|
||||||
Andreas Litt <andreas.litt@gmail.com>
|
Andreas Litt <andreas.litt@gmail.com>
|
||||||
|
Andrei Enshin <b1os@bk.ru>
|
||||||
Andrei Gherzan <andrei@resin.io>
|
Andrei Gherzan <andrei@resin.io>
|
||||||
Andrei Korzhevskii <a.korzhevskiy@gmail.com>
|
Andrei Korzhevskii <a.korzhevskiy@gmail.com>
|
||||||
Andrei Matei <andrei@cockroachlabs.com>
|
Andrei Matei <andrei@cockroachlabs.com>
|
||||||
|
|
@ -177,12 +190,14 @@ Andrew Gerrand <adg@golang.org>
|
||||||
Andrew Harding <andrew@spacemonkey.com>
|
Andrew Harding <andrew@spacemonkey.com>
|
||||||
Andrew Jackura <ajackura@google.com>
|
Andrew Jackura <ajackura@google.com>
|
||||||
Andrew Lutomirski <andy@luto.us>
|
Andrew Lutomirski <andy@luto.us>
|
||||||
|
Andrew Medvedev <andrew.y.medvedev@gmail.com>
|
||||||
Andrew Pilloud <andrewpilloud@igneoussystems.com>
|
Andrew Pilloud <andrewpilloud@igneoussystems.com>
|
||||||
Andrew Pogrebnoy <absourd.noise@gmail.com>
|
Andrew Pogrebnoy <absourd.noise@gmail.com>
|
||||||
Andrew Poydence <apoydence@pivotal.io>
|
Andrew Poydence <apoydence@pivotal.io>
|
||||||
Andrew Pritchard <awpritchard@gmail.com>
|
Andrew Pritchard <awpritchard@gmail.com>
|
||||||
Andrew Radev <andrey.radev@gmail.com>
|
Andrew Radev <andrey.radev@gmail.com>
|
||||||
Andrew Skiba <skibaa@gmail.com>
|
Andrew Skiba <skibaa@gmail.com>
|
||||||
|
Andrew Stormont <astormont@racktopsystems.com>
|
||||||
Andrew Stribblehill <ads@wompom.org>
|
Andrew Stribblehill <ads@wompom.org>
|
||||||
Andrew Szeto <andrew@jabagawee.com>
|
Andrew Szeto <andrew@jabagawee.com>
|
||||||
Andrew Todd <andrew.todd@wework.com>
|
Andrew Todd <andrew.todd@wework.com>
|
||||||
|
|
@ -225,12 +240,14 @@ Anton Gyllenberg <anton@iki.fi>
|
||||||
Antonin Amand <antonin.amand@gmail.com>
|
Antonin Amand <antonin.amand@gmail.com>
|
||||||
Antonio Antelo <aantelov87@gmail.com>
|
Antonio Antelo <aantelov87@gmail.com>
|
||||||
Antonio Bibiano <antbbn@gmail.com>
|
Antonio Bibiano <antbbn@gmail.com>
|
||||||
|
Antonio Huete Jimenez <tuxillo@quantumachine.net>
|
||||||
Antonio Murdaca <runcom@redhat.com>
|
Antonio Murdaca <runcom@redhat.com>
|
||||||
Antonio Troina <thoeni@gmail.com>
|
Antonio Troina <thoeni@gmail.com>
|
||||||
Aofei Sheng <aofei@aofeisheng.com>
|
Aofei Sheng <aofei@aofeisheng.com>
|
||||||
Apisak Darakananda <pongad@gmail.com>
|
Apisak Darakananda <pongad@gmail.com>
|
||||||
Aram Hăvărneanu <aram@mgk.ro>
|
Aram Hăvărneanu <aram@mgk.ro>
|
||||||
Arash Bina <arash@arash.io>
|
Arash Bina <arash@arash.io>
|
||||||
|
Arda Güçlü <ardaguclu@gmail.com>
|
||||||
Areski Belaid <areski@gmail.com>
|
Areski Belaid <areski@gmail.com>
|
||||||
Ariel Mashraki <ariel@mashraki.co.il>
|
Ariel Mashraki <ariel@mashraki.co.il>
|
||||||
Arkadi Pyuro <arkadi@google.com>
|
Arkadi Pyuro <arkadi@google.com>
|
||||||
|
|
@ -239,6 +256,7 @@ Arnaud Ysmal <arnaud.ysmal@gmail.com>
|
||||||
Arne Hormann <arnehormann@gmail.com>
|
Arne Hormann <arnehormann@gmail.com>
|
||||||
Arnout Engelen <arnout@bzzt.net>
|
Arnout Engelen <arnout@bzzt.net>
|
||||||
Aron Nopanen <aron.nopanen@gmail.com>
|
Aron Nopanen <aron.nopanen@gmail.com>
|
||||||
|
Artem Alekseev <artem.alekseev@intel.com>
|
||||||
Artem Kolin <artemkaxboy@gmail.com>
|
Artem Kolin <artemkaxboy@gmail.com>
|
||||||
Arthur Fabre <arthur@arthurfabre.com>
|
Arthur Fabre <arthur@arthurfabre.com>
|
||||||
Arthur Khashaev <arthur@khashaev.ru>
|
Arthur Khashaev <arthur@khashaev.ru>
|
||||||
|
|
@ -258,13 +276,16 @@ Avi Flax <avi@timehop.com>
|
||||||
awaw fumin <awawfumin@gmail.com>
|
awaw fumin <awawfumin@gmail.com>
|
||||||
Awn Umar <awn@cryptolosophy.io>
|
Awn Umar <awn@cryptolosophy.io>
|
||||||
Axel Wagner <axel.wagner.hh@googlemail.com>
|
Axel Wagner <axel.wagner.hh@googlemail.com>
|
||||||
|
Ayan George <ayan@ayan.net>
|
||||||
Ayanamist Yang <ayanamist@gmail.com>
|
Ayanamist Yang <ayanamist@gmail.com>
|
||||||
|
Ayke van Laethem <aykevanlaethem@gmail.com>
|
||||||
Aymerick Jéhanne <aymerick@jehanne.org>
|
Aymerick Jéhanne <aymerick@jehanne.org>
|
||||||
Azat Kaumov <kaumov.a.r@gmail.com>
|
Azat Kaumov <kaumov.a.r@gmail.com>
|
||||||
Baiju Muthukadan <baiju.m.mail@gmail.com>
|
Baiju Muthukadan <baiju.m.mail@gmail.com>
|
||||||
Balaram Makam <bmakam.qdt@qualcommdatacenter.com>
|
Balaram Makam <bmakam.qdt@qualcommdatacenter.com>
|
||||||
Balazs Lecz <leczb@google.com>
|
Balazs Lecz <leczb@google.com>
|
||||||
Baokun Lee <nototon@gmail.com>
|
Baokun Lee <nototon@gmail.com>
|
||||||
|
Barnaby Keene <accounts@southcla.ws>
|
||||||
Bartosz Grzybowski <melkorm@gmail.com>
|
Bartosz Grzybowski <melkorm@gmail.com>
|
||||||
Bartosz Oler <brtsz@google.com>
|
Bartosz Oler <brtsz@google.com>
|
||||||
Bastian Ike <bastian.ike@gmail.com>
|
Bastian Ike <bastian.ike@gmail.com>
|
||||||
|
|
@ -279,12 +300,14 @@ Ben Lynn <benlynn@gmail.com>
|
||||||
Ben Olive <sionide21@gmail.com>
|
Ben Olive <sionide21@gmail.com>
|
||||||
Ben Schwartz <bemasc@google.com>
|
Ben Schwartz <bemasc@google.com>
|
||||||
Ben Shi <powerman1st@163.com>
|
Ben Shi <powerman1st@163.com>
|
||||||
|
Ben Toews <mastahyeti@gmail.com>
|
||||||
Benjamin Black <b@b3k.us>
|
Benjamin Black <b@b3k.us>
|
||||||
Benjamin Cable <cable.benjamin@gmail.com>
|
Benjamin Cable <cable.benjamin@gmail.com>
|
||||||
Benjamin Hsieh <tanookiben@users.noreply.github.com>
|
Benjamin Hsieh <tanookiben@users.noreply.github.com>
|
||||||
Benjamin Peterson <benjamin@python.org>
|
Benjamin Peterson <benjamin@python.org>
|
||||||
Benjamin Prosnitz <bprosnitz@google.com>
|
Benjamin Prosnitz <bprosnitz@google.com>
|
||||||
Benjamin Wester <bwester@squareup.com>
|
Benjamin Wester <bwester@squareup.com>
|
||||||
|
Benjamin Wuethrich <benjamin.wuethrich@gmail.com>
|
||||||
Benny Siegert <bsiegert@gmail.com>
|
Benny Siegert <bsiegert@gmail.com>
|
||||||
Benoit Sigoure <tsunanet@gmail.com>
|
Benoit Sigoure <tsunanet@gmail.com>
|
||||||
Berengar Lehr <Berengar.Lehr@gmx.de>
|
Berengar Lehr <Berengar.Lehr@gmx.de>
|
||||||
|
|
@ -318,11 +341,13 @@ Brad Jones <rbjones@google.com>
|
||||||
Brad Morgan <brad@morgabra.com>
|
Brad Morgan <brad@morgabra.com>
|
||||||
Brad Whitaker <bwhitaker@fastly.com>
|
Brad Whitaker <bwhitaker@fastly.com>
|
||||||
Braden Bassingthwaite <bbassingthwaite@vendasta.com>
|
Braden Bassingthwaite <bbassingthwaite@vendasta.com>
|
||||||
|
Bradford Lamson-Scribner <brad.lamson@gmail.com>
|
||||||
Bradley Falzon <brad@teambrad.net>
|
Bradley Falzon <brad@teambrad.net>
|
||||||
Brady Catherman <brady@gmail.com>
|
Brady Catherman <brady@gmail.com>
|
||||||
Brady Sullivan <brady@bsull.com>
|
Brady Sullivan <brady@bsull.com>
|
||||||
Brandon Bennett <bbennett@fb.com>
|
Brandon Bennett <bbennett@fb.com>
|
||||||
Brandon Gilmore <varz@google.com>
|
Brandon Gilmore <varz@google.com>
|
||||||
|
Brandon Philips <brandon@ifup.org>
|
||||||
Brandon Ryan <bjryan19@gmail.com>
|
Brandon Ryan <bjryan19@gmail.com>
|
||||||
Brendan Daniel Tracey <tracey.brendan@gmail.com>
|
Brendan Daniel Tracey <tracey.brendan@gmail.com>
|
||||||
Brendan O'Dea <bod@golang.org>
|
Brendan O'Dea <bod@golang.org>
|
||||||
|
|
@ -330,6 +355,7 @@ Brett Cannon <bcannon@gmail.com>
|
||||||
Brett Merrill <brett.j.merrill94@gmail.com>
|
Brett Merrill <brett.j.merrill94@gmail.com>
|
||||||
Brian Dellisanti <briandellisanti@gmail.com>
|
Brian Dellisanti <briandellisanti@gmail.com>
|
||||||
Brian Downs <brian.downs@gmail.com>
|
Brian Downs <brian.downs@gmail.com>
|
||||||
|
Brian Falk <falk@logicparty.org>
|
||||||
Brian G. Merrell <bgmerrell@gmail.com>
|
Brian G. Merrell <bgmerrell@gmail.com>
|
||||||
Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com> <bgm@google.com>
|
Brian Gitonga Marete <marete@toshnix.com> <bgmarete@gmail.com> <bgm@google.com>
|
||||||
Brian Kennedy <btkennedy@gmail.com>
|
Brian Kennedy <btkennedy@gmail.com>
|
||||||
|
|
@ -357,6 +383,7 @@ Carl Mastrangelo <notcarl@google.com>
|
||||||
Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
|
Carl Shapiro <cshapiro@google.com> <cshapiro@golang.org>
|
||||||
Carlisia Campos <carlisia@grokkingtech.io>
|
Carlisia Campos <carlisia@grokkingtech.io>
|
||||||
Carlo Alberto Ferraris <cafxx@strayorange.com>
|
Carlo Alberto Ferraris <cafxx@strayorange.com>
|
||||||
|
Carlos Amedee <carlos@golang.org>
|
||||||
Carlos Castillo <cookieo9@gmail.com>
|
Carlos Castillo <cookieo9@gmail.com>
|
||||||
Carlos Cirello <uldericofilho@gmail.com>
|
Carlos Cirello <uldericofilho@gmail.com>
|
||||||
Carlos Eduardo <me@carlosedp.com>
|
Carlos Eduardo <me@carlosedp.com>
|
||||||
|
|
@ -374,12 +401,15 @@ Cedric Staub <cs@squareup.com>
|
||||||
Cezar Sá Espinola <cezarsa@gmail.com>
|
Cezar Sá Espinola <cezarsa@gmail.com>
|
||||||
Chad Rosier <mrosier.qdt@qualcommdatacenter.com>
|
Chad Rosier <mrosier.qdt@qualcommdatacenter.com>
|
||||||
ChaiShushan <chaishushan@gmail.com>
|
ChaiShushan <chaishushan@gmail.com>
|
||||||
|
Changkun Ou <hi@changkun.us>
|
||||||
Channing Kimble-Brown <channing@golang.org>
|
Channing Kimble-Brown <channing@golang.org>
|
||||||
Charles Fenwick Elliott <Charles@FenwickElliott.io>
|
Charles Fenwick Elliott <Charles@FenwickElliott.io>
|
||||||
Charles Kenney <charlesc.kenney@gmail.com>
|
Charles Kenney <charlesc.kenney@gmail.com>
|
||||||
Charles L. Dorian <cldorian@gmail.com>
|
Charles L. Dorian <cldorian@gmail.com>
|
||||||
Charles Lee <zombie.fml@gmail.com>
|
Charles Lee <zombie.fml@gmail.com>
|
||||||
Charles Weill <weill@google.com>
|
Charles Weill <weill@google.com>
|
||||||
|
Chauncy Cullitan <chauncyc@google.com>
|
||||||
|
Chen Zhihan <energiehund@gmail.com>
|
||||||
Cherry Zhang <cherryyz@google.com>
|
Cherry Zhang <cherryyz@google.com>
|
||||||
Chew Choon Keat <choonkeat@gmail.com>
|
Chew Choon Keat <choonkeat@gmail.com>
|
||||||
Cholerae Hu <choleraehyq@gmail.com>
|
Cholerae Hu <choleraehyq@gmail.com>
|
||||||
|
|
@ -418,6 +448,7 @@ Christopher Cahoon <chris.cahoon@gmail.com>
|
||||||
Christopher Guiney <chris@guiney.net>
|
Christopher Guiney <chris@guiney.net>
|
||||||
Christopher Henderson <chris@chenderson.org>
|
Christopher Henderson <chris@chenderson.org>
|
||||||
Christopher Koch <chrisko@google.com>
|
Christopher Koch <chrisko@google.com>
|
||||||
|
Christopher Loessl <cloessl+github@gmail.com>
|
||||||
Christopher Nelson <nadiasvertex@gmail.com>
|
Christopher Nelson <nadiasvertex@gmail.com>
|
||||||
Christopher Nielsen <m4dh4tt3r@gmail.com>
|
Christopher Nielsen <m4dh4tt3r@gmail.com>
|
||||||
Christopher Redden <christopher.redden@gmail.com>
|
Christopher Redden <christopher.redden@gmail.com>
|
||||||
|
|
@ -428,6 +459,7 @@ Christy Perez <christy@linux.vnet.ibm.com>
|
||||||
CL Sung <clsung@gmail.com> <cl_sung@htc.com>
|
CL Sung <clsung@gmail.com> <cl_sung@htc.com>
|
||||||
Clément Chigot <clement.chigot@atos.net>
|
Clément Chigot <clement.chigot@atos.net>
|
||||||
Clement Skau <clementskau@gmail.com>
|
Clement Skau <clementskau@gmail.com>
|
||||||
|
Clint J. Edwards <clint.j.edwards@gmail.com>
|
||||||
Cody Oss <the.cody.oss@gmail.com>
|
Cody Oss <the.cody.oss@gmail.com>
|
||||||
Colby Ranger <cranger@google.com>
|
Colby Ranger <cranger@google.com>
|
||||||
Colin Arnott <colin@urandom.co.uk>
|
Colin Arnott <colin@urandom.co.uk>
|
||||||
|
|
@ -448,6 +480,7 @@ Cristian Staretu <unclejacksons@gmail.com>
|
||||||
Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
|
Cuihtlauac ALVARADO <cuihtlauac.alvarado@orange.com>
|
||||||
Cyrill Schumacher <cyrill@schumacher.fm>
|
Cyrill Schumacher <cyrill@schumacher.fm>
|
||||||
Daisuke Fujita <dtanshi45@gmail.com>
|
Daisuke Fujita <dtanshi45@gmail.com>
|
||||||
|
Daisuke Suzuki <daisuzu@gmail.com>
|
||||||
Daker Fernandes Pinheiro <daker.fernandes.pinheiro@intel.com>
|
Daker Fernandes Pinheiro <daker.fernandes.pinheiro@intel.com>
|
||||||
Damian Gryski <dgryski@gmail.com>
|
Damian Gryski <dgryski@gmail.com>
|
||||||
Damien Lespiau <damien.lespiau@gmail.com> <damien.lespiau@intel.com>
|
Damien Lespiau <damien.lespiau@gmail.com> <damien.lespiau@intel.com>
|
||||||
|
|
@ -462,6 +495,7 @@ Dan Jacques <dnj@google.com>
|
||||||
Dan Johnson <computerdruid@google.com>
|
Dan Johnson <computerdruid@google.com>
|
||||||
Dan Peterson <dpiddy@gmail.com>
|
Dan Peterson <dpiddy@gmail.com>
|
||||||
Dan Pupius <dan@medium.com>
|
Dan Pupius <dan@medium.com>
|
||||||
|
Dan Scales <danscales@google.com>
|
||||||
Dan Sinclair <dan.sinclair@gmail.com>
|
Dan Sinclair <dan.sinclair@gmail.com>
|
||||||
Daniel Cormier <danielc@knowbe4.com>
|
Daniel Cormier <danielc@knowbe4.com>
|
||||||
Daniël de Kok <me@danieldk.eu>
|
Daniël de Kok <me@danieldk.eu>
|
||||||
|
|
@ -501,6 +535,7 @@ Dave Russell <forfuncsake@gmail.com>
|
||||||
David Anderson <danderson@google.com>
|
David Anderson <danderson@google.com>
|
||||||
David Barnett <dbarnett@google.com>
|
David Barnett <dbarnett@google.com>
|
||||||
David Benjamin <davidben@google.com>
|
David Benjamin <davidben@google.com>
|
||||||
|
David Bond <davidsbond93@gmail.com>
|
||||||
David Brophy <dave@brophy.uk>
|
David Brophy <dave@brophy.uk>
|
||||||
David Bürgin <676c7473@gmail.com>
|
David Bürgin <676c7473@gmail.com>
|
||||||
David Calavera <david.calavera@gmail.com>
|
David Calavera <david.calavera@gmail.com>
|
||||||
|
|
@ -541,6 +576,7 @@ Dean Prichard <dean.prichard@gmail.com>
|
||||||
Deepak Jois <deepak.jois@gmail.com>
|
Deepak Jois <deepak.jois@gmail.com>
|
||||||
Denis Bernard <db047h@gmail.com>
|
Denis Bernard <db047h@gmail.com>
|
||||||
Denis Brandolini <denis.brandolini@gmail.com>
|
Denis Brandolini <denis.brandolini@gmail.com>
|
||||||
|
Denis Isaev <idenx@yandex.com>
|
||||||
Denis Nagorny <denis.nagorny@intel.com>
|
Denis Nagorny <denis.nagorny@intel.com>
|
||||||
Dennis Kuhnert <mail.kuhnert@gmail.com>
|
Dennis Kuhnert <mail.kuhnert@gmail.com>
|
||||||
Denys Honsiorovskyi <honsiorovskyi@gmail.com>
|
Denys Honsiorovskyi <honsiorovskyi@gmail.com>
|
||||||
|
|
@ -581,6 +617,7 @@ Dmitry Mottl <dmitry.mottl@gmail.com>
|
||||||
Dmitry Neverov <dmitry.neverov@gmail.com>
|
Dmitry Neverov <dmitry.neverov@gmail.com>
|
||||||
Dmitry Savintsev <dsavints@gmail.com>
|
Dmitry Savintsev <dsavints@gmail.com>
|
||||||
Dmitry Yakunin <nonamezeil@gmail.com>
|
Dmitry Yakunin <nonamezeil@gmail.com>
|
||||||
|
Domas Tamašauskas <puerdomus@gmail.com>
|
||||||
Domen Ipavec <domen@ipavec.net>
|
Domen Ipavec <domen@ipavec.net>
|
||||||
Dominic Green <dominicgreen1@gmail.com>
|
Dominic Green <dominicgreen1@gmail.com>
|
||||||
Dominik Honnef <dominik.honnef@gmail.com>
|
Dominik Honnef <dominik.honnef@gmail.com>
|
||||||
|
|
@ -594,6 +631,7 @@ Doug Fawley <dfawley@google.com>
|
||||||
Douglas Danger Manley <doug.manley@gmail.com>
|
Douglas Danger Manley <doug.manley@gmail.com>
|
||||||
Drew Flower <drewvanstone@gmail.com>
|
Drew Flower <drewvanstone@gmail.com>
|
||||||
Drew Hintz <adhintz@google.com>
|
Drew Hintz <adhintz@google.com>
|
||||||
|
Duco van Amstel <duco.vanamstel@gmail.com>
|
||||||
Duncan Holm <mail@frou.org>
|
Duncan Holm <mail@frou.org>
|
||||||
Dustin Carlino <dcarlino@google.com>
|
Dustin Carlino <dcarlino@google.com>
|
||||||
Dustin Herbison <djherbis@gmail.com>
|
Dustin Herbison <djherbis@gmail.com>
|
||||||
|
|
@ -607,6 +645,7 @@ Eddie Scholtz <escholtz@google.com>
|
||||||
Eden Li <eden.li@gmail.com>
|
Eden Li <eden.li@gmail.com>
|
||||||
Eduard Urbach <e.urbach@gmail.com>
|
Eduard Urbach <e.urbach@gmail.com>
|
||||||
Eduardo Ramalho <eduardo.ramalho@gmail.com>
|
Eduardo Ramalho <eduardo.ramalho@gmail.com>
|
||||||
|
Eduardo Villaseñor <evillasrmx@gmail.com>
|
||||||
Edward Muller <edwardam@interlix.com>
|
Edward Muller <edwardam@interlix.com>
|
||||||
Egon Elbre <egonelbre@gmail.com>
|
Egon Elbre <egonelbre@gmail.com>
|
||||||
Ehren Kret <ehren.kret@gmail.com>
|
Ehren Kret <ehren.kret@gmail.com>
|
||||||
|
|
@ -625,6 +664,8 @@ Emilien Kenler <hello@emilienkenler.com>
|
||||||
Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
|
Emmanuel Odeke <emm.odeke@gmail.com> <odeke@ualberta.ca>
|
||||||
Eno Compton <enocom@google.com>
|
Eno Compton <enocom@google.com>
|
||||||
Eoghan Sherry <ejsherry@gmail.com>
|
Eoghan Sherry <ejsherry@gmail.com>
|
||||||
|
Eric Biggers <ebiggers@google.com>
|
||||||
|
Eric Brown <browne@vmware.com>
|
||||||
Eric Chiang <eric.chiang.m@gmail.com>
|
Eric Chiang <eric.chiang.m@gmail.com>
|
||||||
Eric Clark <zerohp@gmail.com>
|
Eric Clark <zerohp@gmail.com>
|
||||||
Eric Daniels <eric@erdaniels.com>
|
Eric Daniels <eric@erdaniels.com>
|
||||||
|
|
@ -637,6 +678,7 @@ Eric Pauley <eric@pauley.me>
|
||||||
Eric Ponce <tricokun@gmail.com>
|
Eric Ponce <tricokun@gmail.com>
|
||||||
Eric Rescorla <ekr@rtfm.com>
|
Eric Rescorla <ekr@rtfm.com>
|
||||||
Eric Roshan-Eisner <eric.d.eisner@gmail.com>
|
Eric Roshan-Eisner <eric.d.eisner@gmail.com>
|
||||||
|
Eric Rutherford <erutherford@gmail.com>
|
||||||
Eric Rykwalder <e.rykwalder@gmail.com>
|
Eric Rykwalder <e.rykwalder@gmail.com>
|
||||||
Erik Aigner <aigner.erik@gmail.com>
|
Erik Aigner <aigner.erik@gmail.com>
|
||||||
Erik Dubbelboer <erik@dubbelboer.com>
|
Erik Dubbelboer <erik@dubbelboer.com>
|
||||||
|
|
@ -704,12 +746,14 @@ Frank Somers <fsomers@arista.com>
|
||||||
Frederic Guillot <frederic.guillot@gmail.com>
|
Frederic Guillot <frederic.guillot@gmail.com>
|
||||||
Frederick Kelly Mayle III <frederickmayle@gmail.com>
|
Frederick Kelly Mayle III <frederickmayle@gmail.com>
|
||||||
Frederik Ring <frederik.ring@gmail.com>
|
Frederik Ring <frederik.ring@gmail.com>
|
||||||
|
Frederik Zipp <fzipp@gmx.de>
|
||||||
Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
|
Fredrik Enestad <fredrik.enestad@soundtrackyourbrand.com>
|
||||||
Fredrik Forsmo <fredrik.forsmo@gmail.com>
|
Fredrik Forsmo <fredrik.forsmo@gmail.com>
|
||||||
Fredrik Wallgren <fredrik.wallgren@gmail.com>
|
Fredrik Wallgren <fredrik.wallgren@gmail.com>
|
||||||
Frew Schmidt <github@frew.co>
|
Frew Schmidt <github@frew.co>
|
||||||
Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
|
Frithjof Schulze <schulze@math.uni-hannover.de> <sfrithjof@gmail.com>
|
||||||
Frits van Bommel <fvbommel@gmail.com>
|
Frits van Bommel <fvbommel@gmail.com>
|
||||||
|
Fujimoto Kyosuke <kyoro.f@gmail.com>
|
||||||
Fumitoshi Ukai <ukai@google.com>
|
Fumitoshi Ukai <ukai@google.com>
|
||||||
G. Hussain Chinoy <ghchinoy@gmail.com>
|
G. Hussain Chinoy <ghchinoy@gmail.com>
|
||||||
Gaal Yahas <gaal@google.com>
|
Gaal Yahas <gaal@google.com>
|
||||||
|
|
@ -718,6 +762,7 @@ Gabriel Aszalos <gabriel.aszalos@gmail.com>
|
||||||
Gabriel Guzman <gabe.guzman@gmail.com>
|
Gabriel Guzman <gabe.guzman@gmail.com>
|
||||||
Gabriel Nelle <tehsphinx@web.de>
|
Gabriel Nelle <tehsphinx@web.de>
|
||||||
Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
|
Gabriel Nicolas Avellaneda <avellaneda.gabriel@gmail.com>
|
||||||
|
Gabriel Rosenhouse <rosenhouse@gmail.com>
|
||||||
Gabriel Russell <gabriel.russell@gmail.com>
|
Gabriel Russell <gabriel.russell@gmail.com>
|
||||||
Gareth Paul Jones <gpj@foursquare.com>
|
Gareth Paul Jones <gpj@foursquare.com>
|
||||||
Garret Kelly <gdk@google.com>
|
Garret Kelly <gdk@google.com>
|
||||||
|
|
@ -735,18 +780,23 @@ Geoffroy Lorieux <lorieux.g@gmail.com>
|
||||||
Geon Kim <geon0250@gmail.com>
|
Geon Kim <geon0250@gmail.com>
|
||||||
Georg Reinke <guelfey@gmail.com>
|
Georg Reinke <guelfey@gmail.com>
|
||||||
George Gkirtsou <ggirtsou@gmail.com>
|
George Gkirtsou <ggirtsou@gmail.com>
|
||||||
|
George Hartzell <hartzell@alerce.com>
|
||||||
George Shammas <george@shamm.as> <georgyo@gmail.com>
|
George Shammas <george@shamm.as> <georgyo@gmail.com>
|
||||||
Gerasimos (Makis) Maropoulos <kataras2006@hotmail.com>
|
Gerasimos (Makis) Maropoulos <kataras2006@hotmail.com>
|
||||||
Gerasimos Dimitriadis <gedimitr@gmail.com>
|
Gerasimos Dimitriadis <gedimitr@gmail.com>
|
||||||
Gergely Brautigam <skarlso777@gmail.com>
|
Gergely Brautigam <skarlso777@gmail.com>
|
||||||
Gernot Vormayr <gvormayr@gmail.com>
|
Gernot Vormayr <gvormayr@gmail.com>
|
||||||
|
Gert Cuykens <gert.cuykens@gmail.com>
|
||||||
Getulio Sánchez <valentin2507@gmail.com>
|
Getulio Sánchez <valentin2507@gmail.com>
|
||||||
|
Ghazni Nattarshah <ghazni.nattarshah@gmail.com>
|
||||||
Gianguido Sora` <g.sora4@gmail.com>
|
Gianguido Sora` <g.sora4@gmail.com>
|
||||||
Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
|
Gideon Jan-Wessel Redelinghuys <gjredelinghuys@gmail.com>
|
||||||
Giles Lean <giles.lean@pobox.com>
|
Giles Lean <giles.lean@pobox.com>
|
||||||
Giovanni Bajo <rasky@develer.com>
|
Giovanni Bajo <rasky@develer.com>
|
||||||
GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
|
GitHub User @ajnirp (1688456) <ajnirp@users.noreply.github.com>
|
||||||
|
GitHub User @ajz01 (4744634) <ajzdenek@gmail.com>
|
||||||
GitHub User @alkesh26 (1019076) <alkesh26@gmail.com>
|
GitHub User @alkesh26 (1019076) <alkesh26@gmail.com>
|
||||||
|
GitHub User @andig (184815) <cpuidle@gmx.de>
|
||||||
GitHub User @andrius4669 (4699695) <andrius4669@gmail.com>
|
GitHub User @andrius4669 (4699695) <andrius4669@gmail.com>
|
||||||
GitHub User @as (8127015) <as.utf8@gmail.com>
|
GitHub User @as (8127015) <as.utf8@gmail.com>
|
||||||
GitHub User @bakape (7851952) <bakape@gmail.com>
|
GitHub User @bakape (7851952) <bakape@gmail.com>
|
||||||
|
|
@ -754,31 +804,43 @@ GitHub User @bgadrian (830001) <aditza8@gmail.com>
|
||||||
GitHub User @bontequero (2674999) <bontequero@gmail.com>
|
GitHub User @bontequero (2674999) <bontequero@gmail.com>
|
||||||
GitHub User @cch123 (384546) <buaa.cch@gmail.com>
|
GitHub User @cch123 (384546) <buaa.cch@gmail.com>
|
||||||
GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
|
GitHub User @chanxuehong (3416908) <chanxuehong@gmail.com>
|
||||||
|
GitHub User @DQNEO (188741) <dqneoo@gmail.com>
|
||||||
GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
|
GitHub User @dupoxy (1143957) <dupoxy@users.noreply.github.com>
|
||||||
GitHub User @erifan (31343225) <eric.fang@arm.com>
|
GitHub User @erifan (31343225) <eric.fang@arm.com>
|
||||||
GitHub User @esell (9735165) <eujon.sellers@gmail.com>
|
GitHub User @esell (9735165) <eujon.sellers@gmail.com>
|
||||||
GitHub User @frennkie (6499251) <mail@rhab.de>
|
GitHub User @frennkie (6499251) <mail@rhab.de>
|
||||||
GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
|
GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com>
|
||||||
GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
|
GitHub User @itchyny (375258) <itchyny@hatena.ne.jp>
|
||||||
|
GitHub User @jinmiaoluo (39730824) <jinmiaoluo@icloud.com>
|
||||||
|
GitHub User @jopbrown (6345470) <msshane2008@gmail.com>
|
||||||
GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
|
GitHub User @kazyshr (30496953) <kazyshr0301@gmail.com>
|
||||||
GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
|
GitHub User @kc1212 (1093806) <kc1212@users.noreply.github.com>
|
||||||
GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
|
GitHub User @Kropekk (13366453) <kamilkropiewnicki@gmail.com>
|
||||||
GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
|
GitHub User @linguohua (3434367) <lghchinaidea@gmail.com>
|
||||||
GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
|
GitHub User @LotusFenn (13775899) <fenn.lotus@gmail.com>
|
||||||
GitHub User @madiganz (18340029) <zacharywmadigan@gmail.com>
|
GitHub User @madiganz (18340029) <zacharywmadigan@gmail.com>
|
||||||
|
GitHub User @maltalex (10195391) <code@bit48.net>
|
||||||
|
GitHub User @Matts966 (28551465) <Matts966@users.noreply.github.com>
|
||||||
GitHub User @micnncim (21333876) <micnncim@gmail.com>
|
GitHub User @micnncim (21333876) <micnncim@gmail.com>
|
||||||
GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com>
|
GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com>
|
||||||
GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
|
GitHub User @OlgaVlPetrova (44112727) <OVPpetrova@gmail.com>
|
||||||
GitHub User @pityonline (438222) <pityonline@gmail.com>
|
GitHub User @pityonline (438222) <pityonline@gmail.com>
|
||||||
|
GitHub User @po3rin (29445112) <abctail30@gmail.com>
|
||||||
|
GitHub User @pokutuna (57545) <popopopopokutuna@gmail.com>
|
||||||
GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
|
GitHub User @pytimer (17105586) <lixin20101023@gmail.com>
|
||||||
|
GitHub User @ramenjuniti (32011829) <ramenjuniti@gmail.com>
|
||||||
GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
|
GitHub User @saitarunreddy (21041941) <saitarunreddypalla@gmail.com>
|
||||||
GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
|
GitHub User @shogo-ma (9860598) <Choroma194@gmail.com>
|
||||||
|
GitHub User @skanehira (7888591) <sho19921005@gmail.com>
|
||||||
GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
|
GitHub User @tatsumack (4510569) <tatsu.mack@gmail.com>
|
||||||
GitHub User @tell-k (26263) <ffk2005@gmail.com>
|
GitHub User @tell-k (26263) <ffk2005@gmail.com>
|
||||||
GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
|
GitHub User @uhei (2116845) <uhei@users.noreply.github.com>
|
||||||
GitHub User @uropek (39370426) <uropek@gmail.com>
|
GitHub User @uropek (39370426) <uropek@gmail.com>
|
||||||
GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
|
GitHub User @utkarsh-extc (53217283) <utkarsh.extc@gmail.com>
|
||||||
|
GitHub User @witchard (4994659) <witchard@hotmail.co.uk>
|
||||||
|
GitHub User @yah01 (12216890) <kagaminehuan@gmail.com>
|
||||||
GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
|
GitHub User @yuanhh (1298735) <yuan415030@gmail.com>
|
||||||
|
GitHub User @zikaeroh (48577114) <zikaeroh@gmail.com>
|
||||||
GitHub User @ZZMarquis (7624583) <zhonglingjian3821@163.com>
|
GitHub User @ZZMarquis (7624583) <zhonglingjian3821@163.com>
|
||||||
Giulio Iotti <dullgiulio@gmail.com>
|
Giulio Iotti <dullgiulio@gmail.com>
|
||||||
Giulio Micheloni <giulio.micheloni@gmail.com>
|
Giulio Micheloni <giulio.micheloni@gmail.com>
|
||||||
|
|
@ -802,6 +864,7 @@ Guilherme Garnier <guilherme.garnier@gmail.com>
|
||||||
Guilherme Goncalves <guilhermeaugustosg@gmail.com>
|
Guilherme Goncalves <guilhermeaugustosg@gmail.com>
|
||||||
Guilherme Rezende <guilhermebr@gmail.com>
|
Guilherme Rezende <guilhermebr@gmail.com>
|
||||||
Guillaume J. Charmes <guillaume@charmes.net>
|
Guillaume J. Charmes <guillaume@charmes.net>
|
||||||
|
Günther Noack <gnoack@google.com>
|
||||||
Guobiao Mei <meiguobiao@gmail.com>
|
Guobiao Mei <meiguobiao@gmail.com>
|
||||||
Guoliang Wang <iamwgliang@gmail.com>
|
Guoliang Wang <iamwgliang@gmail.com>
|
||||||
Gustav Paul <gustav.paul@gmail.com>
|
Gustav Paul <gustav.paul@gmail.com>
|
||||||
|
|
@ -825,6 +888,7 @@ Harley Laue <losinggeneration@gmail.com>
|
||||||
Harry Moreno <morenoh149@gmail.com>
|
Harry Moreno <morenoh149@gmail.com>
|
||||||
Harshavardhana <hrshvardhana@gmail.com>
|
Harshavardhana <hrshvardhana@gmail.com>
|
||||||
Hasan Ozgan <hasan@ozgan.net>
|
Hasan Ozgan <hasan@ozgan.net>
|
||||||
|
Hasit Bhatt <hasit.p.bhatt@gmail.com>
|
||||||
Hauke Löffler <hloeffler@users.noreply.github.com>
|
Hauke Löffler <hloeffler@users.noreply.github.com>
|
||||||
Håvard Haugen <havard.haugen@gmail.com>
|
Håvard Haugen <havard.haugen@gmail.com>
|
||||||
He Liu <liulonnie@gmail.com>
|
He Liu <liulonnie@gmail.com>
|
||||||
|
|
@ -844,6 +908,7 @@ Heschi Kreinick <heschi@google.com>
|
||||||
Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
|
Hidetatsu Yaginuma <ygnmhdtt@gmail.com>
|
||||||
Hilko Bengen <bengen@hilluzination.de>
|
Hilko Bengen <bengen@hilluzination.de>
|
||||||
Hiroaki Nakamura <hnakamur@gmail.com>
|
Hiroaki Nakamura <hnakamur@gmail.com>
|
||||||
|
Hiromichi Ema <ema.hiro@gmail.com>
|
||||||
Hironao OTSUBO <motemen@gmail.com>
|
Hironao OTSUBO <motemen@gmail.com>
|
||||||
Hiroshi Ioka <hirochachacha@gmail.com>
|
Hiroshi Ioka <hirochachacha@gmail.com>
|
||||||
Hitoshi Mitake <mitake.hitoshi@gmail.com>
|
Hitoshi Mitake <mitake.hitoshi@gmail.com>
|
||||||
|
|
@ -852,9 +917,11 @@ Hong Ruiqi <hongruiqi@gmail.com>
|
||||||
Hongfei Tan <feilengcui008@gmail.com>
|
Hongfei Tan <feilengcui008@gmail.com>
|
||||||
Horst Rutter <hhrutter@gmail.com>
|
Horst Rutter <hhrutter@gmail.com>
|
||||||
Hossein Sheikh Attar <hattar@google.com>
|
Hossein Sheikh Attar <hattar@google.com>
|
||||||
|
Howard Zhang <howard.zhang@arm.com>
|
||||||
Hsin Tsao <tsao@google.com>
|
Hsin Tsao <tsao@google.com>
|
||||||
Hsin-Ho Yeh <yhh92u@gmail.com>
|
Hsin-Ho Yeh <yhh92u@gmail.com>
|
||||||
Hu Keping <hukeping@huawei.com>
|
Hu Keping <hukeping@huawei.com>
|
||||||
|
Huan Du <i@huandu.me>
|
||||||
Hugues Bruant <hugues.bruant@gmail.com>
|
Hugues Bruant <hugues.bruant@gmail.com>
|
||||||
Huy Le <huy.dinh.le.89@gmail.com>
|
Huy Le <huy.dinh.le.89@gmail.com>
|
||||||
Hyang-Ah Hana Kim <hakim@google.com> <hyangah@gmail.com>
|
Hyang-Ah Hana Kim <hakim@google.com> <hyangah@gmail.com>
|
||||||
|
|
@ -870,11 +937,13 @@ Ibrahim AshShohail <ibra.sho@gmail.com>
|
||||||
Icarus Sparry <golang@icarus.freeuk.com>
|
Icarus Sparry <golang@icarus.freeuk.com>
|
||||||
Iccha Sethi <icchasethi@gmail.com>
|
Iccha Sethi <icchasethi@gmail.com>
|
||||||
Idora Shinatose <idora.shinatose@gmail.com>
|
Idora Shinatose <idora.shinatose@gmail.com>
|
||||||
|
Ignacio Hagopian <jsign.uy@gmail.com>
|
||||||
Igor Bernstein <igorbernstein@google.com>
|
Igor Bernstein <igorbernstein@google.com>
|
||||||
Igor Dolzhikov <bluesriverz@gmail.com>
|
Igor Dolzhikov <bluesriverz@gmail.com>
|
||||||
Igor Vashyst <ivashyst@gmail.com>
|
Igor Vashyst <ivashyst@gmail.com>
|
||||||
Igor Zhilianin <igor.zhilianin@gmail.com>
|
Igor Zhilianin <igor.zhilianin@gmail.com>
|
||||||
Illya Yalovyy <yalovoy@gmail.com>
|
Illya Yalovyy <yalovoy@gmail.com>
|
||||||
|
Ilya Sinelnikov <sidhmangh@gmail.com>
|
||||||
Ilya Tocar <ilya.tocar@intel.com>
|
Ilya Tocar <ilya.tocar@intel.com>
|
||||||
INADA Naoki <songofacandy@gmail.com>
|
INADA Naoki <songofacandy@gmail.com>
|
||||||
Inanc Gumus <m@inanc.io>
|
Inanc Gumus <m@inanc.io>
|
||||||
|
|
@ -882,10 +951,12 @@ Ingo Gottwald <in.gottwald@gmail.com>
|
||||||
Ingo Krabbe <ikrabbe.ask@gmail.com>
|
Ingo Krabbe <ikrabbe.ask@gmail.com>
|
||||||
Ingo Oeser <nightlyone@googlemail.com> <nightlyone@gmail.com>
|
Ingo Oeser <nightlyone@googlemail.com> <nightlyone@gmail.com>
|
||||||
Ioannis Georgoulas <geototti21@hotmail.com>
|
Ioannis Georgoulas <geototti21@hotmail.com>
|
||||||
|
Irbe Krumina <irbekrm@gmail.com>
|
||||||
Irfan Sharif <irfanmahmoudsharif@gmail.com>
|
Irfan Sharif <irfanmahmoudsharif@gmail.com>
|
||||||
Irieda Noboru <irieda@gmail.com>
|
Irieda Noboru <irieda@gmail.com>
|
||||||
Isaac Ardis <isaac.ardis@gmail.com>
|
Isaac Ardis <isaac.ardis@gmail.com>
|
||||||
Isaac Wagner <ibw@isaacwagner.me>
|
Isaac Wagner <ibw@isaacwagner.me>
|
||||||
|
Isfan Azhabil <isfan.azhabil@tokopedia.com>
|
||||||
Iskander Sharipov <iskander.sharipov@intel.com> <quasilyte@gmail.com>
|
Iskander Sharipov <iskander.sharipov@intel.com> <quasilyte@gmail.com>
|
||||||
Issac Trotts <issactrotts@google.com>
|
Issac Trotts <issactrotts@google.com>
|
||||||
Ivan Babrou <ivan@cloudflare.com>
|
Ivan Babrou <ivan@cloudflare.com>
|
||||||
|
|
@ -896,9 +967,11 @@ Ivan Markin <sw@nogoegst.net>
|
||||||
Ivan Moscoso <moscoso@gmail.com>
|
Ivan Moscoso <moscoso@gmail.com>
|
||||||
Ivan Osadchiy <ivan.osadchii@gmail.com>
|
Ivan Osadchiy <ivan.osadchii@gmail.com>
|
||||||
Ivan Sharavuev <shpiwan@gmail.com>
|
Ivan Sharavuev <shpiwan@gmail.com>
|
||||||
|
Ivan Trubach <mr.trubach@icloud.com>
|
||||||
Ivan Ukhov <ivan.ukhov@gmail.com>
|
Ivan Ukhov <ivan.ukhov@gmail.com>
|
||||||
Ivy Evans <ivy@ivyevans.net>
|
Ivy Evans <ivy@ivyevans.net>
|
||||||
Jaana Burcu Dogan <jbd@google.com> <jbd@golang.org> <burcujdogan@gmail.com>
|
Jaana Burcu Dogan <jbd@google.com> <jbd@golang.org> <burcujdogan@gmail.com>
|
||||||
|
Jaap Aarts <jaap.aarts1@gmail.com>
|
||||||
Jack Britton <jackxbritton@gmail.com>
|
Jack Britton <jackxbritton@gmail.com>
|
||||||
Jack Lindamood <jlindamo@justin.tv>
|
Jack Lindamood <jlindamo@justin.tv>
|
||||||
Jacob Baskin <jbaskin@google.com>
|
Jacob Baskin <jbaskin@google.com>
|
||||||
|
|
@ -912,6 +985,7 @@ Jakob Borg <jakob@nym.se>
|
||||||
Jakob Weisblat <jakobw@mit.edu>
|
Jakob Weisblat <jakobw@mit.edu>
|
||||||
Jakub Čajka <jcajka@redhat.com>
|
Jakub Čajka <jcajka@redhat.com>
|
||||||
Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
|
Jakub Ryszard Czarnowicz <j.czarnowicz@gmail.com>
|
||||||
|
Jamal Carvalho <jamal.a.carvalho@gmail.com>
|
||||||
James Aguilar <jaguilar@google.com>
|
James Aguilar <jaguilar@google.com>
|
||||||
James Bardin <j.bardin@gmail.com>
|
James Bardin <j.bardin@gmail.com>
|
||||||
James Chacon <jchacon@google.com>
|
James Chacon <jchacon@google.com>
|
||||||
|
|
@ -959,6 +1033,7 @@ Jannis Andrija Schnitzer <jannis@schnitzer.im>
|
||||||
Jared Culp <jculp14@gmail.com>
|
Jared Culp <jculp14@gmail.com>
|
||||||
Jaroslavas Počepko <jp@webmaster.ms>
|
Jaroslavas Počepko <jp@webmaster.ms>
|
||||||
Jason A. Donenfeld <Jason@zx2c4.com>
|
Jason A. Donenfeld <Jason@zx2c4.com>
|
||||||
|
Jason Baker <jason-baker@users.noreply.github.com>
|
||||||
Jason Barnett <jason.w.barnett@gmail.com>
|
Jason Barnett <jason.w.barnett@gmail.com>
|
||||||
Jason Buberel <jbuberel@google.com>
|
Jason Buberel <jbuberel@google.com>
|
||||||
Jason Chu <jasonchujc@gmail.com>
|
Jason Chu <jasonchujc@gmail.com>
|
||||||
|
|
@ -982,6 +1057,7 @@ Jean-Francois Cantin <jfcantin@gmail.com>
|
||||||
Jean-Marc Eurin <jmeurin@google.com>
|
Jean-Marc Eurin <jmeurin@google.com>
|
||||||
Jean-Nicolas Moal <jn.moal@gmail.com>
|
Jean-Nicolas Moal <jn.moal@gmail.com>
|
||||||
Jed Denlea <jed@fastly.com>
|
Jed Denlea <jed@fastly.com>
|
||||||
|
Jędrzej Szczepaniak <jbszczepaniak@gmail.com>
|
||||||
Jeet Parekh <jeetparekh96@gmail.com>
|
Jeet Parekh <jeetparekh96@gmail.com>
|
||||||
Jeevanandam M <jeeva@myjeeva.com>
|
Jeevanandam M <jeeva@myjeeva.com>
|
||||||
Jeff (Zhefu) Jiang <jeffjiang@google.com>
|
Jeff (Zhefu) Jiang <jeffjiang@google.com>
|
||||||
|
|
@ -998,6 +1074,7 @@ Jens Frederich <jfrederich@gmail.com>
|
||||||
Jeremiah Harmsen <jeremiah@google.com>
|
Jeremiah Harmsen <jeremiah@google.com>
|
||||||
Jeremy Banks <_@jeremy.ca>
|
Jeremy Banks <_@jeremy.ca>
|
||||||
Jeremy Canady <jcanady@gmail.com>
|
Jeremy Canady <jcanady@gmail.com>
|
||||||
|
Jeremy Faller <jeremy@golang.org>
|
||||||
Jeremy Jackins <jeremyjackins@gmail.com>
|
Jeremy Jackins <jeremyjackins@gmail.com>
|
||||||
Jeremy Jay <jeremy@pbnjay.com>
|
Jeremy Jay <jeremy@pbnjay.com>
|
||||||
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
Jeremy Schlatter <jeremy.schlatter@gmail.com>
|
||||||
|
|
@ -1042,6 +1119,7 @@ Joel Stemmer <stemmertech@gmail.com>
|
||||||
Joey Geiger <jgeiger@users.noreply.github.com>
|
Joey Geiger <jgeiger@users.noreply.github.com>
|
||||||
Johan Brandhorst <johan.brandhorst@gmail.com>
|
Johan Brandhorst <johan.brandhorst@gmail.com>
|
||||||
Johan Euphrosine <proppy@google.com>
|
Johan Euphrosine <proppy@google.com>
|
||||||
|
Johan Jansson <johan.jansson@iki.fi>
|
||||||
Johan Sageryd <j@1616.se>
|
Johan Sageryd <j@1616.se>
|
||||||
John Asmuth <jasmuth@gmail.com>
|
John Asmuth <jasmuth@gmail.com>
|
||||||
John Beisley <huin@google.com>
|
John Beisley <huin@google.com>
|
||||||
|
|
@ -1057,6 +1135,7 @@ John Jenkins <twodopeshaggy@gmail.com>
|
||||||
John Leidegren <john.leidegren@gmail.com>
|
John Leidegren <john.leidegren@gmail.com>
|
||||||
John Moore <johnkenneth.moore@gmail.com>
|
John Moore <johnkenneth.moore@gmail.com>
|
||||||
John Newlin <jnewlin@google.com>
|
John Newlin <jnewlin@google.com>
|
||||||
|
John Papandriopoulos <jpap.code@gmail.com>
|
||||||
John Potocny <johnp@vividcortex.com>
|
John Potocny <johnp@vividcortex.com>
|
||||||
John R. Lenton <jlenton@gmail.com>
|
John R. Lenton <jlenton@gmail.com>
|
||||||
John Schnake <schnake.john@gmail.com>
|
John Schnake <schnake.john@gmail.com>
|
||||||
|
|
@ -1090,7 +1169,9 @@ Jordan Liggitt <liggitt@google.com>
|
||||||
Jordan Rhee <jordanrh@microsoft.com>
|
Jordan Rhee <jordanrh@microsoft.com>
|
||||||
Jordi Martin <jordimartin@gmail.com>
|
Jordi Martin <jordimartin@gmail.com>
|
||||||
Jorge Araya <jorgejavieran@yahoo.com.mx>
|
Jorge Araya <jorgejavieran@yahoo.com.mx>
|
||||||
|
Jorge L. Fatta <jorge.fatta@auth0.com>
|
||||||
Jos Visser <josv@google.com>
|
Jos Visser <josv@google.com>
|
||||||
|
Josa Gesell <josa@gesell.me>
|
||||||
Jose Luis Vázquez González <josvazg@gmail.com>
|
Jose Luis Vázquez González <josvazg@gmail.com>
|
||||||
Joseph Bonneau <jcb@google.com>
|
Joseph Bonneau <jcb@google.com>
|
||||||
Joseph Holsten <joseph@josephholsten.com>
|
Joseph Holsten <joseph@josephholsten.com>
|
||||||
|
|
@ -1119,11 +1200,13 @@ Julia Hansbrough <flowerhack@google.com>
|
||||||
Julian Kornberger <jk+github@digineo.de>
|
Julian Kornberger <jk+github@digineo.de>
|
||||||
Julian Pastarmov <pastarmovj@google.com>
|
Julian Pastarmov <pastarmovj@google.com>
|
||||||
Julian Phillips <julian@quantumfyre.co.uk>
|
Julian Phillips <julian@quantumfyre.co.uk>
|
||||||
|
Julian Tibble <julian.tibble@gmail.com>
|
||||||
Julie Qiu <julie@golang.org>
|
Julie Qiu <julie@golang.org>
|
||||||
Julien Kauffmann <julien.kauffmann@freelan.org>
|
Julien Kauffmann <julien.kauffmann@freelan.org>
|
||||||
Julien Salleyron <julien.salleyron@gmail.com>
|
Julien Salleyron <julien.salleyron@gmail.com>
|
||||||
Julien Schmidt <google@julienschmidt.com>
|
Julien Schmidt <google@julienschmidt.com>
|
||||||
Julio Montes <julio.montes@intel.com>
|
Julio Montes <julio.montes@intel.com>
|
||||||
|
Jun Zhang <jim.zoumo@gmail.com>
|
||||||
Junda Liu <junda@celer.network>
|
Junda Liu <junda@celer.network>
|
||||||
Jungho Ahn <jhahn@google.com>
|
Jungho Ahn <jhahn@google.com>
|
||||||
Junya Hayashi <ledmonster@gmail.com>
|
Junya Hayashi <ledmonster@gmail.com>
|
||||||
|
|
@ -1133,17 +1216,18 @@ Justin Gracenin <jgracenin@gmail.com>
|
||||||
Justin Li <git@justinli.net>
|
Justin Li <git@justinli.net>
|
||||||
Justin Nuß <nuss.justin@gmail.com>
|
Justin Nuß <nuss.justin@gmail.com>
|
||||||
Justyn Temme <justyntemme@gmail.com>
|
Justyn Temme <justyntemme@gmail.com>
|
||||||
Kelly Heller <pestophagous@gmail.com>
|
|
||||||
Kai Backman <kaib@golang.org>
|
Kai Backman <kaib@golang.org>
|
||||||
Kai Dong <dokia2357@gmail.com>
|
Kai Dong <dokia2357@gmail.com>
|
||||||
Kai Trukenmüller <ktye78@gmail.com>
|
Kai Trukenmüller <ktye78@gmail.com>
|
||||||
Kale Blankenship <kale@lemnisys.com>
|
Kale Blankenship <kale@lemnisys.com>
|
||||||
Kaleb Elwert <kelwert@atlassian.com>
|
Kaleb Elwert <kelwert@atlassian.com>
|
||||||
|
Kalman Bekesi <kalmanb@google.com>
|
||||||
Kamal Aboul-Hosn <aboulhosn@google.com>
|
Kamal Aboul-Hosn <aboulhosn@google.com>
|
||||||
Kamil Chmielewski <kamil.chm@gmail.com>
|
Kamil Chmielewski <kamil.chm@gmail.com>
|
||||||
Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
|
Kamil Kisiel <kamil@kamilkisiel.net> <kamil.kisiel@gmail.com>
|
||||||
Kamil Rytarowski <krytarowski@users.noreply.github.com>
|
Kamil Rytarowski <krytarowski@users.noreply.github.com>
|
||||||
Kang Hu <hukangustc@gmail.com>
|
Kang Hu <hukangustc@gmail.com>
|
||||||
|
Kanta Ebihara <kantaebihara@gmail.com>
|
||||||
Karan Dhiman <karandhi@ca.ibm.com>
|
Karan Dhiman <karandhi@ca.ibm.com>
|
||||||
Karel Pazdera <pazderak@gmail.com>
|
Karel Pazdera <pazderak@gmail.com>
|
||||||
Karoly Negyesi <chx1975@gmail.com>
|
Karoly Negyesi <chx1975@gmail.com>
|
||||||
|
|
@ -1151,6 +1235,7 @@ Karsten Köhler <karsten.koehler95@gmail.com>
|
||||||
Karthik Nayak <karthik.188@gmail.com>
|
Karthik Nayak <karthik.188@gmail.com>
|
||||||
Kashav Madan <kshvmdn@gmail.com>
|
Kashav Madan <kshvmdn@gmail.com>
|
||||||
Kate Manson <kate.manson@izettle.com>
|
Kate Manson <kate.manson@izettle.com>
|
||||||
|
Katharine Berry <ktbry@google.com>
|
||||||
Katie Hockman <katie@golang.org>
|
Katie Hockman <katie@golang.org>
|
||||||
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
|
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
|
||||||
Katrina Owen <katrina.owen@gmail.com>
|
Katrina Owen <katrina.owen@gmail.com>
|
||||||
|
|
@ -1161,9 +1246,11 @@ KB Sriram <kbsriram@google.com>
|
||||||
Keegan Carruthers-Smith <keegan.csmith@gmail.com>
|
Keegan Carruthers-Smith <keegan.csmith@gmail.com>
|
||||||
Kei Son <hey.calmdown@gmail.com>
|
Kei Son <hey.calmdown@gmail.com>
|
||||||
Keiji Yoshida <keijiyoshida.mail@gmail.com>
|
Keiji Yoshida <keijiyoshida.mail@gmail.com>
|
||||||
|
Keisuke Kishimoto <keisuke.kishimoto@gmail.com>
|
||||||
Keith Ball <inflatablewoman@gmail.com>
|
Keith Ball <inflatablewoman@gmail.com>
|
||||||
Keith Randall <khr@golang.org>
|
Keith Randall <khr@golang.org>
|
||||||
Keith Rarick <kr@xph.us>
|
Keith Rarick <kr@xph.us>
|
||||||
|
Kelly Heller <pestophagous@gmail.com>
|
||||||
Kelsey Hightower <kelsey.hightower@gmail.com>
|
Kelsey Hightower <kelsey.hightower@gmail.com>
|
||||||
Kelvin Foo Chuan Lyi <vmirage@gmail.com>
|
Kelvin Foo Chuan Lyi <vmirage@gmail.com>
|
||||||
Ken Friedenbach <kenliz@cruzio.com>
|
Ken Friedenbach <kenliz@cruzio.com>
|
||||||
|
|
@ -1177,8 +1264,10 @@ Kenneth Shaw <kenshaw@gmail.com>
|
||||||
Kenny Grant <kennygrant@gmail.com>
|
Kenny Grant <kennygrant@gmail.com>
|
||||||
Kenta Mori <zoncoen@gmail.com>
|
Kenta Mori <zoncoen@gmail.com>
|
||||||
Ketan Parmar <ketanbparmar@gmail.com>
|
Ketan Parmar <ketanbparmar@gmail.com>
|
||||||
|
Kevan Swanberg <kevswanberg@gmail.com>
|
||||||
Kevin Ballard <kevin@sb.org>
|
Kevin Ballard <kevin@sb.org>
|
||||||
Kevin Burke <kev@inburke.com>
|
Kevin Burke <kev@inburke.com>
|
||||||
|
Kévin Dunglas <dunglas@gmail.com>
|
||||||
Kevin Gillette <extemporalgenome@gmail.com>
|
Kevin Gillette <extemporalgenome@gmail.com>
|
||||||
Kevin Kirsche <kev.kirsche@gmail.com>
|
Kevin Kirsche <kev.kirsche@gmail.com>
|
||||||
Kevin Klues <klueska@gmail.com> <klueska@google.com>
|
Kevin Klues <klueska@gmail.com> <klueska@google.com>
|
||||||
|
|
@ -1192,15 +1281,18 @@ Kim Yongbin <kybinz@gmail.com>
|
||||||
Kir Kolyshkin <kolyshkin@gmail.com>
|
Kir Kolyshkin <kolyshkin@gmail.com>
|
||||||
Kirill Motkov <Motkov.Kirill@gmail.com>
|
Kirill Motkov <Motkov.Kirill@gmail.com>
|
||||||
Kirill Smelkov <kirr@nexedi.com>
|
Kirill Smelkov <kirr@nexedi.com>
|
||||||
|
Kirill Tatchihin <kirabsuir@gmail.com>
|
||||||
Kirk Han <kirk91.han@gmail.com>
|
Kirk Han <kirk91.han@gmail.com>
|
||||||
Kirklin McDonald <kirklin.mcdonald@gmail.com>
|
Kirklin McDonald <kirklin.mcdonald@gmail.com>
|
||||||
Klaus Post <klauspost@gmail.com>
|
Klaus Post <klauspost@gmail.com>
|
||||||
Kodie Goodwin <kodiegoodwin@gmail.com>
|
Kodie Goodwin <kodiegoodwin@gmail.com>
|
||||||
Koichi Shiraishi <zchee.io@gmail.com>
|
Koichi Shiraishi <zchee.io@gmail.com>
|
||||||
Koki Ide <niconegoto@yahoo.co.jp>
|
Koki Ide <niconegoto@yahoo.co.jp>
|
||||||
|
Koki Tomoshige <tomocy.dev@gmail.com>
|
||||||
Komu Wairagu <komuw05@gmail.com>
|
Komu Wairagu <komuw05@gmail.com>
|
||||||
Konstantin <konstantin8105@gmail.com>
|
Konstantin <konstantin8105@gmail.com>
|
||||||
Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
|
Konstantin Shaposhnikov <k.shaposhnikov@gmail.com>
|
||||||
|
Koya IWAMURA <kiwamura0314@gmail.com>
|
||||||
Kris Kwiatkowski <kris@cloudflare.com>
|
Kris Kwiatkowski <kris@cloudflare.com>
|
||||||
Kris Nova <kris@nivenly.com>
|
Kris Nova <kris@nivenly.com>
|
||||||
Kris Rousey <krousey@google.com>
|
Kris Rousey <krousey@google.com>
|
||||||
|
|
@ -1245,8 +1337,10 @@ Leonel Quinteros <leonel.quinteros@gmail.com>
|
||||||
Lev Shamardin <shamardin@gmail.com>
|
Lev Shamardin <shamardin@gmail.com>
|
||||||
Lewin Bormann <lewin.bormann@gmail.com>
|
Lewin Bormann <lewin.bormann@gmail.com>
|
||||||
Lion Yang <lion@aosc.xyz>
|
Lion Yang <lion@aosc.xyz>
|
||||||
|
Liz Rice <liz@lizrice.com>
|
||||||
Lloyd Dewolf <foolswisdom@gmail.com>
|
Lloyd Dewolf <foolswisdom@gmail.com>
|
||||||
Lorenz Bauer <lmb@cloudflare.com>
|
Lorenz Bauer <lmb@cloudflare.com>
|
||||||
|
Lorenz Brun <lorenz@brun.one>
|
||||||
Lorenz Nickel <mail@lorenznickel.de>
|
Lorenz Nickel <mail@lorenznickel.de>
|
||||||
Lorenzo Masini <rugginoso@develer.com>
|
Lorenzo Masini <rugginoso@develer.com>
|
||||||
Lorenzo Stoakes <lstoakes@gmail.com>
|
Lorenzo Stoakes <lstoakes@gmail.com>
|
||||||
|
|
@ -1268,6 +1362,7 @@ Lukasz Milewski <lmmilewski@gmail.com>
|
||||||
Luke Champine <luke.champine@gmail.com>
|
Luke Champine <luke.champine@gmail.com>
|
||||||
Luke Curley <qpingu@gmail.com>
|
Luke Curley <qpingu@gmail.com>
|
||||||
Luke Granger-Brown <git@lukegb.com>
|
Luke Granger-Brown <git@lukegb.com>
|
||||||
|
Luke Young <bored-engineer@users.noreply.github.com>
|
||||||
Luna Duclos <luna.duclos@palmstonegames.com>
|
Luna Duclos <luna.duclos@palmstonegames.com>
|
||||||
Luuk van Dijk <lvd@golang.org> <lvd@google.com>
|
Luuk van Dijk <lvd@golang.org> <lvd@google.com>
|
||||||
Lyle Franklin <lylejfranklin@gmail.com>
|
Lyle Franklin <lylejfranklin@gmail.com>
|
||||||
|
|
@ -1290,6 +1385,7 @@ Manu Garg <manugarg@google.com>
|
||||||
Manu S Ajith <neo@codingarena.in>
|
Manu S Ajith <neo@codingarena.in>
|
||||||
Manuel Mendez <mmendez534@gmail.com>
|
Manuel Mendez <mmendez534@gmail.com>
|
||||||
Marat Khabibullin <marat.khabibullin@jetbrains.com>
|
Marat Khabibullin <marat.khabibullin@jetbrains.com>
|
||||||
|
Marc Sanmiquel <marcsanmiquel@gmail.com>
|
||||||
Marc Weistroff <marc@weistroff.net>
|
Marc Weistroff <marc@weistroff.net>
|
||||||
Marc-Antoine Ruel <maruel@chromium.org>
|
Marc-Antoine Ruel <maruel@chromium.org>
|
||||||
Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
|
Marcel Edmund Franke <marcel.edmund.franke@gmail.com>
|
||||||
|
|
@ -1299,6 +1395,7 @@ Marcelo E. Magallon <marcelo.magallon@gmail.com>
|
||||||
Marco Hennings <marco.hennings@freiheit.com>
|
Marco Hennings <marco.hennings@freiheit.com>
|
||||||
Marcus Willock <crazcalm@gmail.com>
|
Marcus Willock <crazcalm@gmail.com>
|
||||||
Marga Manterola <marga@google.com>
|
Marga Manterola <marga@google.com>
|
||||||
|
Mariano Cano <mariano@smallstep.com>
|
||||||
Marin Bašić <marin.basic02@gmail.com>
|
Marin Bašić <marin.basic02@gmail.com>
|
||||||
Mario Arranz <marioarranzr@gmail.com>
|
Mario Arranz <marioarranzr@gmail.com>
|
||||||
Marius A. Eriksen <marius@grailbio.com>
|
Marius A. Eriksen <marius@grailbio.com>
|
||||||
|
|
@ -1318,6 +1415,7 @@ Mark Wolfe <mark@wolfe.id.au>
|
||||||
Mark Zavislak <zavislak@google.com>
|
Mark Zavislak <zavislak@google.com>
|
||||||
Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
|
Marko Juhani Silokunnas <marko.silokunnas@gmail.com>
|
||||||
Marko Kevac <marko@kevac.org>
|
Marko Kevac <marko@kevac.org>
|
||||||
|
Marko Kungla <marko.kungla@gmail.com>
|
||||||
Marko Mikulicic <mkm@google.com>
|
Marko Mikulicic <mkm@google.com>
|
||||||
Marko Mudrinic <mudrinic.mare@gmail.com>
|
Marko Mudrinic <mudrinic.mare@gmail.com>
|
||||||
Marko Tiikkaja <marko@joh.to>
|
Marko Tiikkaja <marko@joh.to>
|
||||||
|
|
@ -1473,6 +1571,7 @@ Mike Solomon <msolo@gmail.com>
|
||||||
Mike Strosaker <strosake@us.ibm.com>
|
Mike Strosaker <strosake@us.ibm.com>
|
||||||
Mike Tsao <mike@sowbug.com>
|
Mike Tsao <mike@sowbug.com>
|
||||||
Mike Wiacek <mjwiacek@google.com>
|
Mike Wiacek <mjwiacek@google.com>
|
||||||
|
Mikhail Fesenko <proggga@gmail.com>
|
||||||
Mikhail Gusarov <dottedmag@dottedmag.net>
|
Mikhail Gusarov <dottedmag@dottedmag.net>
|
||||||
Mikhail Panchenko <m@mihasya.com>
|
Mikhail Panchenko <m@mihasya.com>
|
||||||
Miki Tebeka <miki.tebeka@gmail.com>
|
Miki Tebeka <miki.tebeka@gmail.com>
|
||||||
|
|
@ -1488,9 +1587,11 @@ Miroslav Genov <mgenov@gmail.com>
|
||||||
Misty De Meo <mistydemeo@gmail.com>
|
Misty De Meo <mistydemeo@gmail.com>
|
||||||
Mohit Agarwal <mohit@sdf.org>
|
Mohit Agarwal <mohit@sdf.org>
|
||||||
Mohit kumar Bajoria <mohitbajo36@gmail.com>
|
Mohit kumar Bajoria <mohitbajo36@gmail.com>
|
||||||
|
Mohit Verma <vmohit.93@gmail.com>
|
||||||
Momchil Velikov <momchil.velikov@gmail.com>
|
Momchil Velikov <momchil.velikov@gmail.com>
|
||||||
Monis Khan <mkhan@redhat.com>
|
Monis Khan <mkhan@redhat.com>
|
||||||
Monty Taylor <mordred@inaugust.com>
|
Monty Taylor <mordred@inaugust.com>
|
||||||
|
Moritz Fain <moritz@fain.io>
|
||||||
Moriyoshi Koizumi <mozo@mozo.jp>
|
Moriyoshi Koizumi <mozo@mozo.jp>
|
||||||
Morten Siebuhr <sbhr@sbhr.dk>
|
Morten Siebuhr <sbhr@sbhr.dk>
|
||||||
Môshe van der Sterre <moshevds@gmail.com>
|
Môshe van der Sterre <moshevds@gmail.com>
|
||||||
|
|
@ -1507,6 +1608,7 @@ Naoki Kanatani <k12naoki@gmail.com>
|
||||||
Nate Wilkinson <nathanwilk7@gmail.com>
|
Nate Wilkinson <nathanwilk7@gmail.com>
|
||||||
Nathan Cantelmo <n.cantelmo@gmail.com>
|
Nathan Cantelmo <n.cantelmo@gmail.com>
|
||||||
Nathan Caza <mastercactapus@gmail.com>
|
Nathan Caza <mastercactapus@gmail.com>
|
||||||
|
Nathan Dias <nathan.dias@orijtech.com>
|
||||||
Nathan Humphreys <nkhumphreys@gmail.com>
|
Nathan Humphreys <nkhumphreys@gmail.com>
|
||||||
Nathan John Youngman <nj@nathany.com>
|
Nathan John Youngman <nj@nathany.com>
|
||||||
Nathan Otterness <otternes@cs.unc.edu>
|
Nathan Otterness <otternes@cs.unc.edu>
|
||||||
|
|
@ -1551,6 +1653,7 @@ Nigel Tao <nigeltao@golang.org>
|
||||||
Nik Nyby <nnyby@columbia.edu>
|
Nik Nyby <nnyby@columbia.edu>
|
||||||
Nikhil Benesch <nikhil.benesch@gmail.com>
|
Nikhil Benesch <nikhil.benesch@gmail.com>
|
||||||
Nikita Kryuchkov <nkryuchkov10@gmail.com>
|
Nikita Kryuchkov <nkryuchkov10@gmail.com>
|
||||||
|
Nikita Vanyasin <nikita.vanyasin@gmail.com>
|
||||||
Niklas Schnelle <niklas.schnelle@gmail.com>
|
Niklas Schnelle <niklas.schnelle@gmail.com>
|
||||||
Niko Dziemba <niko@dziemba.com>
|
Niko Dziemba <niko@dziemba.com>
|
||||||
Nikolay Turpitko <nikolay@turpitko.com>
|
Nikolay Turpitko <nikolay@turpitko.com>
|
||||||
|
|
@ -1564,12 +1667,14 @@ Nodir Turakulov <nodir@google.com>
|
||||||
Noel Georgi <git@frezbo.com>
|
Noel Georgi <git@frezbo.com>
|
||||||
Norberto Lopes <nlopes.ml@gmail.com>
|
Norberto Lopes <nlopes.ml@gmail.com>
|
||||||
Norman B. Lancaster <qbradq@gmail.com>
|
Norman B. Lancaster <qbradq@gmail.com>
|
||||||
|
Nuno Cruces <ncruces@users.noreply.github.com>
|
||||||
Odin Ugedal <odin@ugedal.com>
|
Odin Ugedal <odin@ugedal.com>
|
||||||
Oleg Bulatov <dmage@yandex-team.ru>
|
Oleg Bulatov <dmage@yandex-team.ru>
|
||||||
Oleg Vakheta <helginet@gmail.com>
|
Oleg Vakheta <helginet@gmail.com>
|
||||||
Oleku Konko <oleku.konko@gmail.com>
|
Oleku Konko <oleku.konko@gmail.com>
|
||||||
Oling Cat <olingcat@gmail.com>
|
Oling Cat <olingcat@gmail.com>
|
||||||
Oliver Hookins <ohookins@gmail.com>
|
Oliver Hookins <ohookins@gmail.com>
|
||||||
|
Oliver Powell <oliverpowell84@gmail.com>
|
||||||
Oliver Stenbom <ostenbom@pivotal.io>
|
Oliver Stenbom <ostenbom@pivotal.io>
|
||||||
Oliver Tonnhofer <olt@bogosoft.com>
|
Oliver Tonnhofer <olt@bogosoft.com>
|
||||||
Olivier Antoine <olivier.antoine@gmail.com>
|
Olivier Antoine <olivier.antoine@gmail.com>
|
||||||
|
|
@ -1585,6 +1690,8 @@ Pablo Rozas Larraondo <pablo.larraondo@anu.edu.au>
|
||||||
Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
|
Pablo Santiago Blum de Aguiar <scorphus@gmail.com>
|
||||||
Padraig Kitterick <padraigkitterick@gmail.com>
|
Padraig Kitterick <padraigkitterick@gmail.com>
|
||||||
Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
|
Pallat Anchaleechamaikorn <yod.pallat@gmail.com>
|
||||||
|
Panos Georgiadis <pgeorgiadis@suse.de>
|
||||||
|
Pantelis Sampaziotis <psampaz@gmail.com>
|
||||||
Paolo Giarrusso <p.giarrusso@gmail.com>
|
Paolo Giarrusso <p.giarrusso@gmail.com>
|
||||||
Paolo Martini <mrtnpaolo@gmail.com>
|
Paolo Martini <mrtnpaolo@gmail.com>
|
||||||
Parker Moore <parkrmoore@gmail.com>
|
Parker Moore <parkrmoore@gmail.com>
|
||||||
|
|
@ -1626,6 +1733,7 @@ Paul van Brouwershaven <paul@vanbrouwershaven.com>
|
||||||
Paul Wankadia <junyer@google.com>
|
Paul Wankadia <junyer@google.com>
|
||||||
Paulo Casaretto <pcasaretto@gmail.com>
|
Paulo Casaretto <pcasaretto@gmail.com>
|
||||||
Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
Paulo Flabiano Smorigo <pfsmorigo@linux.vnet.ibm.com>
|
||||||
|
Paulo Gomes <paulo.gomes.uk@gmail.com>
|
||||||
Pavel Paulau <pavel.paulau@gmail.com>
|
Pavel Paulau <pavel.paulau@gmail.com>
|
||||||
Pavel Zinovkin <pavel.zinovkin@gmail.com>
|
Pavel Zinovkin <pavel.zinovkin@gmail.com>
|
||||||
Pavlo Sumkin <ymkins@gmail.com>
|
Pavlo Sumkin <ymkins@gmail.com>
|
||||||
|
|
@ -1679,6 +1787,7 @@ Piyush Mishra <piyush@codeitout.com>
|
||||||
Plekhanov Maxim <kishtatix@gmail.com>
|
Plekhanov Maxim <kishtatix@gmail.com>
|
||||||
Pontus Leitzler <leitzler@gmail.com>
|
Pontus Leitzler <leitzler@gmail.com>
|
||||||
Prasanna Swaminathan <prasanna@mediamath.com>
|
Prasanna Swaminathan <prasanna@mediamath.com>
|
||||||
|
Prashant Agrawal <prashant.a.vjti@gmail.com>
|
||||||
Prashant Varanasi <prashant@prashantv.com>
|
Prashant Varanasi <prashant@prashantv.com>
|
||||||
Pravendra Singh <hackpravj@gmail.com>
|
Pravendra Singh <hackpravj@gmail.com>
|
||||||
Preetam Jinka <pj@preet.am>
|
Preetam Jinka <pj@preet.am>
|
||||||
|
|
@ -1720,6 +1829,7 @@ Rémy Oudompheng <oudomphe@phare.normalesup.org> <remyoudompheng@gmail.com>
|
||||||
Rens Rikkerink <Ikkerens@users.noreply.github.com>
|
Rens Rikkerink <Ikkerens@users.noreply.github.com>
|
||||||
Rhys Hiltner <rhys@justin.tv>
|
Rhys Hiltner <rhys@justin.tv>
|
||||||
Ricardo Padilha <ricardospadilha@gmail.com>
|
Ricardo Padilha <ricardospadilha@gmail.com>
|
||||||
|
Ricardo Seriani <ricardo.seriani@gmail.com>
|
||||||
Richard Barnes <rlb@ipv.sx>
|
Richard Barnes <rlb@ipv.sx>
|
||||||
Richard Crowley <r@rcrowley.org>
|
Richard Crowley <r@rcrowley.org>
|
||||||
Richard Dingwall <rdingwall@gmail.com>
|
Richard Dingwall <rdingwall@gmail.com>
|
||||||
|
|
@ -1734,6 +1844,7 @@ Rijnard van Tonder <rvantonder@gmail.com>
|
||||||
Riku Voipio <riku.voipio@linaro.org>
|
Riku Voipio <riku.voipio@linaro.org>
|
||||||
Risto Jaakko Saarelma <rsaarelm@gmail.com>
|
Risto Jaakko Saarelma <rsaarelm@gmail.com>
|
||||||
Rob Earhart <earhart@google.com>
|
Rob Earhart <earhart@google.com>
|
||||||
|
Rob Findley <rfindley@google.com>
|
||||||
Rob Norman <rob.norman@infinitycloud.com>
|
Rob Norman <rob.norman@infinitycloud.com>
|
||||||
Rob Phoenix <rob@robphoenix.com>
|
Rob Phoenix <rob@robphoenix.com>
|
||||||
Rob Pike <r@golang.org>
|
Rob Pike <r@golang.org>
|
||||||
|
|
@ -1753,17 +1864,20 @@ Robert-André Mauchin <zebob.m@gmail.com>
|
||||||
Roberto Clapis <robclap8@gmail.com>
|
Roberto Clapis <robclap8@gmail.com>
|
||||||
Roberto Selbach <roberto@selbach.ca>
|
Roberto Selbach <roberto@selbach.ca>
|
||||||
Robin Eklind <r.eklind.87@gmail.com>
|
Robin Eklind <r.eklind.87@gmail.com>
|
||||||
|
Robin Zhong <robin@robinzhong.co>
|
||||||
Rodolfo Carvalho <rhcarvalho@gmail.com>
|
Rodolfo Carvalho <rhcarvalho@gmail.com>
|
||||||
Rodolfo Rodriguez <rodolfobgibson@gmail.com>
|
Rodolfo Rodriguez <rodolfobgibson@gmail.com>
|
||||||
Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
|
Rodrigo Moraes de Oliveira <rodrigo.moraes@gmail.com>
|
||||||
Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
|
Rodrigo Rafael Monti Kochenburger <divoxx@gmail.com>
|
||||||
Roger Pau Monné <royger@gmail.com>
|
Roger Pau Monné <royger@gmail.com>
|
||||||
Roger Peppe <rogpeppe@gmail.com>
|
Roger Peppe <rogpeppe@gmail.com>
|
||||||
|
Rohan Challa <rohan@golang.org>
|
||||||
Rohan Verma <rohanverma2004@gmail.com>
|
Rohan Verma <rohanverma2004@gmail.com>
|
||||||
Roland Illig <roland.illig@gmx.de>
|
Roland Illig <roland.illig@gmx.de>
|
||||||
Roland Shoemaker <rolandshoemaker@gmail.com>
|
Roland Shoemaker <rolandshoemaker@gmail.com>
|
||||||
Romain Baugue <romain.baugue@elwinar.com>
|
Romain Baugue <romain.baugue@elwinar.com>
|
||||||
Roman Budnikov <romanyx90@yandex.ru>
|
Roman Budnikov <romanyx90@yandex.ru>
|
||||||
|
Roman Kollár <roman.kollar.0@gmail.com>
|
||||||
Roman Shchekin <mrqtros@gmail.com>
|
Roman Shchekin <mrqtros@gmail.com>
|
||||||
Ron Hashimoto <mail@h2so5.net>
|
Ron Hashimoto <mail@h2so5.net>
|
||||||
Ron Minnich <rminnich@gmail.com>
|
Ron Minnich <rminnich@gmail.com>
|
||||||
|
|
@ -1774,6 +1888,7 @@ Rowan Marshall <rowanajmarshall@gmail.com>
|
||||||
Rowan Worth <sqweek@gmail.com>
|
Rowan Worth <sqweek@gmail.com>
|
||||||
Rudi Kramer <rudi.kramer@gmail.com>
|
Rudi Kramer <rudi.kramer@gmail.com>
|
||||||
Rui Ueyama <ruiu@google.com>
|
Rui Ueyama <ruiu@google.com>
|
||||||
|
Ruixin Bao <ruixin.bao@ibm.com>
|
||||||
Ruslan Nigmatullin <elessar@dropbox.com>
|
Ruslan Nigmatullin <elessar@dropbox.com>
|
||||||
Russ Cox <rsc@golang.org>
|
Russ Cox <rsc@golang.org>
|
||||||
Russell Haering <russellhaering@gmail.com>
|
Russell Haering <russellhaering@gmail.com>
|
||||||
|
|
@ -1815,6 +1930,7 @@ Sander van Harmelen <sander@vanharmelen.nl>
|
||||||
Sanjay Menakuru <balasanjay@gmail.com>
|
Sanjay Menakuru <balasanjay@gmail.com>
|
||||||
Santhosh Kumar Tekuri <santhosh.tekuri@gmail.com>
|
Santhosh Kumar Tekuri <santhosh.tekuri@gmail.com>
|
||||||
Sarah Adams <shadams@google.com>
|
Sarah Adams <shadams@google.com>
|
||||||
|
Sardorbek Pulatov <sardorbek.pulatov@outlook.com>
|
||||||
Sascha Brawer <sascha@brawer.ch>
|
Sascha Brawer <sascha@brawer.ch>
|
||||||
Sasha Lionheart <lionhearts@google.com>
|
Sasha Lionheart <lionhearts@google.com>
|
||||||
Sasha Sobol <sasha@scaledinference.com>
|
Sasha Sobol <sasha@scaledinference.com>
|
||||||
|
|
@ -1824,6 +1940,7 @@ Scott Crunkleton <crunk1@gmail.com>
|
||||||
Scott Ferguson <scottwferg@gmail.com>
|
Scott Ferguson <scottwferg@gmail.com>
|
||||||
Scott Lawrence <bytbox@gmail.com>
|
Scott Lawrence <bytbox@gmail.com>
|
||||||
Scott Mansfield <smansfield@netflix.com>
|
Scott Mansfield <smansfield@netflix.com>
|
||||||
|
Scott Ragan <ragansa@fb.com>
|
||||||
Scott Schwartz <scotts@golang.org>
|
Scott Schwartz <scotts@golang.org>
|
||||||
Scott Van Woudenberg <scottvw@google.com>
|
Scott Van Woudenberg <scottvw@google.com>
|
||||||
Sean Burford <sburford@google.com>
|
Sean Burford <sburford@google.com>
|
||||||
|
|
@ -1832,20 +1949,25 @@ Sean Chittenden <seanc@joyent.com>
|
||||||
Sean Christopherson <sean.j.christopherson@intel.com>
|
Sean Christopherson <sean.j.christopherson@intel.com>
|
||||||
Sean Dolphin <Sean.Dolphin@kpcompass.com>
|
Sean Dolphin <Sean.Dolphin@kpcompass.com>
|
||||||
Sean Harger <sharger@google.com>
|
Sean Harger <sharger@google.com>
|
||||||
|
Sean Liao <seankhliao@gmail.com>
|
||||||
Sean Rees <sean@erifax.org>
|
Sean Rees <sean@erifax.org>
|
||||||
Sebastiaan van Stijn <github@gone.nl>
|
Sebastiaan van Stijn <github@gone.nl>
|
||||||
|
Sebastian Chlopecki <sebsebmc@gmail.com>
|
||||||
|
Sebastian Kinne <skinne@google.com>
|
||||||
Sebastian Schmidt <yath@google.com>
|
Sebastian Schmidt <yath@google.com>
|
||||||
Sebastien Binet <seb.binet@gmail.com>
|
Sebastien Binet <seb.binet@gmail.com>
|
||||||
Sébastien Paolacci <sebastien.paolacci@gmail.com>
|
Sébastien Paolacci <sebastien.paolacci@gmail.com>
|
||||||
Sebastien Williams-Wynn <sebastien@cytora.com>
|
Sebastien Williams-Wynn <sebastien@cytora.com>
|
||||||
Segev Finer <segev208@gmail.com>
|
Segev Finer <segev208@gmail.com>
|
||||||
Seiji Takahashi <timaki.st@gmail.com>
|
Seiji Takahashi <timaki.st@gmail.com>
|
||||||
|
Sergei Lemeshkin <sergeilem@gmail.com>
|
||||||
Sergei Skorobogatov <skorobo@rambler.ru>
|
Sergei Skorobogatov <skorobo@rambler.ru>
|
||||||
Sergei Zagurskii <gvozdoder@gmail.com>
|
Sergei Zagurskii <gvozdoder@gmail.com>
|
||||||
Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
|
Sergey 'SnakE' Gromov <snake.scaly@gmail.com>
|
||||||
Sergey Arseev <sergey.arseev@intel.com>
|
Sergey Arseev <sergey.arseev@intel.com>
|
||||||
Sergey Dobrodey <sergey.dobrodey@synesis.ru>
|
Sergey Dobrodey <sergey.dobrodey@synesis.ru>
|
||||||
Sergey Frolov <sfrolov@google.com>
|
Sergey Frolov <sfrolov@google.com>
|
||||||
|
Sergey Ivanov <ser1325@gmail.com>
|
||||||
Sergey Lukjanov <me@slukjanov.name>
|
Sergey Lukjanov <me@slukjanov.name>
|
||||||
Sergey Mishin <sergeymishine@gmail.com>
|
Sergey Mishin <sergeymishine@gmail.com>
|
||||||
Sergey Mudrik <sergey.mudrik@gmail.com>
|
Sergey Mudrik <sergey.mudrik@gmail.com>
|
||||||
|
|
@ -1853,6 +1975,7 @@ Sergey Semin <gray12511@gmail.com>
|
||||||
Sergey Yanykin <syanykin@ozon.ru>
|
Sergey Yanykin <syanykin@ozon.ru>
|
||||||
Sergio Luis O. B. Correia <sergio@correia.cc>
|
Sergio Luis O. B. Correia <sergio@correia.cc>
|
||||||
Sergiusz Bazanski <bazanski@gmail.com>
|
Sergiusz Bazanski <bazanski@gmail.com>
|
||||||
|
Serhat Giydiren <serhatgiydiren@gmail.com>
|
||||||
Serhii Aheienko <serhii.aheienko@gmail.com>
|
Serhii Aheienko <serhii.aheienko@gmail.com>
|
||||||
Seth Hoenig <seth.a.hoenig@gmail.com>
|
Seth Hoenig <seth.a.hoenig@gmail.com>
|
||||||
Seth Vargo <sethvargo@gmail.com>
|
Seth Vargo <sethvargo@gmail.com>
|
||||||
|
|
@ -1875,21 +1998,28 @@ Shintaro Kaneko <kaneshin0120@gmail.com>
|
||||||
Shivakumar GN <shivakumar.gn@gmail.com>
|
Shivakumar GN <shivakumar.gn@gmail.com>
|
||||||
Shivani Singhal <shivani.singhal2804@gmail.com>
|
Shivani Singhal <shivani.singhal2804@gmail.com>
|
||||||
Shivansh Rai <shivansh@freebsd.org>
|
Shivansh Rai <shivansh@freebsd.org>
|
||||||
|
Shivashis Padhi <shivashispadhi@gmail.com>
|
||||||
Shubham Sharma <shubham.sha12@gmail.com>
|
Shubham Sharma <shubham.sha12@gmail.com>
|
||||||
Shun Fan <sfan@google.com>
|
Shun Fan <sfan@google.com>
|
||||||
Silvan Jegen <s.jegen@gmail.com>
|
Silvan Jegen <s.jegen@gmail.com>
|
||||||
|
Simarpreet Singh <simar@linux.com>
|
||||||
|
Simon Ferquel <simon.ferquel@docker.com>
|
||||||
Simon Jefford <simon.jefford@gmail.com>
|
Simon Jefford <simon.jefford@gmail.com>
|
||||||
Simon Rawet <simon@rawet.se>
|
Simon Rawet <simon@rawet.se>
|
||||||
|
Simon Rozman <simon@rozman.si>
|
||||||
Simon Thulbourn <simon+github@thulbourn.com>
|
Simon Thulbourn <simon+github@thulbourn.com>
|
||||||
Simon Whitehead <chemnova@gmail.com>
|
Simon Whitehead <chemnova@gmail.com>
|
||||||
Sina Siadat <siadat@gmail.com>
|
Sina Siadat <siadat@gmail.com>
|
||||||
|
Sjoerd Siebinga <sjoerd.siebinga@gmail.com>
|
||||||
Sokolov Yura <funny.falcon@gmail.com>
|
Sokolov Yura <funny.falcon@gmail.com>
|
||||||
Song Gao <song@gao.io>
|
Song Gao <song@gao.io>
|
||||||
|
Spencer Kocot <spencerkocot@gmail.com>
|
||||||
Spencer Nelson <s@spenczar.com>
|
Spencer Nelson <s@spenczar.com>
|
||||||
Spencer Tung <spencertung@google.com>
|
Spencer Tung <spencertung@google.com>
|
||||||
Spring Mc <heresy.mc@gmail.com>
|
Spring Mc <heresy.mc@gmail.com>
|
||||||
Srdjan Petrovic <spetrovic@google.com>
|
Srdjan Petrovic <spetrovic@google.com>
|
||||||
Sridhar Venkatakrishnan <sridhar@laddoo.net>
|
Sridhar Venkatakrishnan <sridhar@laddoo.net>
|
||||||
|
Srinidhi Kaushik <shrinidhi.kaushik@gmail.com>
|
||||||
StalkR <stalkr@stalkr.net>
|
StalkR <stalkr@stalkr.net>
|
||||||
Stan Schwertly <stan@schwertly.com>
|
Stan Schwertly <stan@schwertly.com>
|
||||||
Stanislav Afanasev <php.progger@gmail.com>
|
Stanislav Afanasev <php.progger@gmail.com>
|
||||||
|
|
@ -1931,6 +2061,7 @@ Suyash <dextrous93@gmail.com>
|
||||||
Suzy Mueller <suzmue@golang.org>
|
Suzy Mueller <suzmue@golang.org>
|
||||||
Sven Almgren <sven@tras.se>
|
Sven Almgren <sven@tras.se>
|
||||||
Sven Blumenstein <svbl@google.com>
|
Sven Blumenstein <svbl@google.com>
|
||||||
|
Sven Taute <sven.taute@gmail.com>
|
||||||
Sylvain Zimmer <sylvain@sylvainzimmer.com>
|
Sylvain Zimmer <sylvain@sylvainzimmer.com>
|
||||||
Syohei YOSHIDA <syohex@gmail.com>
|
Syohei YOSHIDA <syohex@gmail.com>
|
||||||
Szabolcs Nagy <nsz@port70.net>
|
Szabolcs Nagy <nsz@port70.net>
|
||||||
|
|
@ -1948,6 +2079,7 @@ Takuto Ikuta <tikuta@google.com>
|
||||||
Takuya Ueda <uedatakuya@gmail.com>
|
Takuya Ueda <uedatakuya@gmail.com>
|
||||||
Tal Shprecher <tshprecher@gmail.com>
|
Tal Shprecher <tshprecher@gmail.com>
|
||||||
Tamir Duberstein <tamird@gmail.com>
|
Tamir Duberstein <tamird@gmail.com>
|
||||||
|
Tao Qingyun <qingyunha@gmail.com>
|
||||||
Tao Shen <shentaoskyking@gmail.com>
|
Tao Shen <shentaoskyking@gmail.com>
|
||||||
Tao Wang <twang2218@gmail.com>
|
Tao Wang <twang2218@gmail.com>
|
||||||
Tarmigan Casebolt <tarmigan@gmail.com>
|
Tarmigan Casebolt <tarmigan@gmail.com>
|
||||||
|
|
@ -1977,10 +2109,12 @@ Thomas Desrosiers <thomasdesr@gmail.com>
|
||||||
Thomas Habets <habets@google.com>
|
Thomas Habets <habets@google.com>
|
||||||
Thomas Kappler <tkappler@gmail.com>
|
Thomas Kappler <tkappler@gmail.com>
|
||||||
Thomas Meson <zllak@hycik.org>
|
Thomas Meson <zllak@hycik.org>
|
||||||
|
Thomas Symborski <thomas.symborski@gmail.com>
|
||||||
Thomas Wanielista <tomwans@gmail.com>
|
Thomas Wanielista <tomwans@gmail.com>
|
||||||
Thorben Krueger <thorben.krueger@gmail.com>
|
Thorben Krueger <thorben.krueger@gmail.com>
|
||||||
Thordur Bjornsson <thorduri@secnorth.net>
|
Thordur Bjornsson <thorduri@secnorth.net>
|
||||||
Tiago Queiroz <contato@tiago.eti.br>
|
Tiago Queiroz <contato@tiago.eti.br>
|
||||||
|
Tianji Wu <the729@gmail.com>
|
||||||
Tianon Gravi <admwiggin@gmail.com>
|
Tianon Gravi <admwiggin@gmail.com>
|
||||||
Tilman Dilo <tilman.dilo@gmail.com>
|
Tilman Dilo <tilman.dilo@gmail.com>
|
||||||
Tim Cooijmans <timcooijmans@gmail.com>
|
Tim Cooijmans <timcooijmans@gmail.com>
|
||||||
|
|
@ -2014,7 +2148,9 @@ Tom Payne <twpayne@gmail.com>
|
||||||
Tom Szymanski <tgs@google.com>
|
Tom Szymanski <tgs@google.com>
|
||||||
Tom Thorogood <me+google@tomthorogood.co.uk>
|
Tom Thorogood <me+google@tomthorogood.co.uk>
|
||||||
Tom Wilkie <tom@weave.works>
|
Tom Wilkie <tom@weave.works>
|
||||||
|
Tomas Dabasinskas <tomas@dabasinskas.net>
|
||||||
Tommy Schaefer <tommy.schaefer@teecom.com>
|
Tommy Schaefer <tommy.schaefer@teecom.com>
|
||||||
|
Tomohiro Kusumoto <zabio1192@gmail.com>
|
||||||
Tomoya Ishizaki <zaq1tomo@gmail.com>
|
Tomoya Ishizaki <zaq1tomo@gmail.com>
|
||||||
Tonis Tiigi <tonistiigi@gmail.com>
|
Tonis Tiigi <tonistiigi@gmail.com>
|
||||||
Tony Reix <tony.reix@bull.net>
|
Tony Reix <tony.reix@bull.net>
|
||||||
|
|
@ -2064,6 +2200,7 @@ Victor Chudnovsky <vchudnov@google.com>
|
||||||
Victor Vrantchan <vrancean+github@gmail.com>
|
Victor Vrantchan <vrancean+github@gmail.com>
|
||||||
Vignesh Ramachandra <vickyramachandra@gmail.com>
|
Vignesh Ramachandra <vickyramachandra@gmail.com>
|
||||||
Vikas Kedia <vikask@google.com>
|
Vikas Kedia <vikask@google.com>
|
||||||
|
Ville Skyttä <ville.skytta@iki.fi>
|
||||||
Vincent Ambo <tazjin@googlemail.com>
|
Vincent Ambo <tazjin@googlemail.com>
|
||||||
Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
|
Vincent Batts <vbatts@hashbangbash.com> <vbatts@gmail.com>
|
||||||
Vincent Vanackere <vincent.vanackere@gmail.com>
|
Vincent Vanackere <vincent.vanackere@gmail.com>
|
||||||
|
|
@ -2071,15 +2208,18 @@ Vinu Rajashekhar <vinutheraj@gmail.com>
|
||||||
Vish Subramanian <vish@google.com>
|
Vish Subramanian <vish@google.com>
|
||||||
Vishvananda Ishaya <vishvananda@gmail.com>
|
Vishvananda Ishaya <vishvananda@gmail.com>
|
||||||
Visweswara R <r.visweswara@gmail.com>
|
Visweswara R <r.visweswara@gmail.com>
|
||||||
|
Vitaly Zdanevich <zdanevich.vitaly@ya.ru>
|
||||||
Vitor De Mario <vitordemario@gmail.com>
|
Vitor De Mario <vitordemario@gmail.com>
|
||||||
Vivek Sekhar <vsekhar@google.com>
|
Vivek Sekhar <vsekhar@google.com>
|
||||||
Vlad Krasnov <vlad@cloudflare.com>
|
Vlad Krasnov <vlad@cloudflare.com>
|
||||||
|
Vladimir Evgrafov <evgrafov.vladimir@gmail.com>
|
||||||
Vladimir Kovpak <cn007b@gmail.com>
|
Vladimir Kovpak <cn007b@gmail.com>
|
||||||
Vladimir Kuzmin <vkuzmin@uber.com>
|
Vladimir Kuzmin <vkuzmin@uber.com>
|
||||||
Vladimir Mihailenco <vladimir.webdev@gmail.com>
|
Vladimir Mihailenco <vladimir.webdev@gmail.com>
|
||||||
Vladimir Nikishenko <vova616@gmail.com>
|
Vladimir Nikishenko <vova616@gmail.com>
|
||||||
Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
|
Vladimir Stefanovic <vladimir.stefanovic@imgtec.com>
|
||||||
Vladimir Varankin <nek.narqo@gmail.com>
|
Vladimir Varankin <nek.narqo@gmail.com>
|
||||||
|
Vojtech Bocek <vbocek@gmail.com>
|
||||||
Volker Dobler <dr.volker.dobler@gmail.com>
|
Volker Dobler <dr.volker.dobler@gmail.com>
|
||||||
Volodymyr Paprotski <vpaprots@ca.ibm.com>
|
Volodymyr Paprotski <vpaprots@ca.ibm.com>
|
||||||
W. Trevor King <wking@tremily.us>
|
W. Trevor King <wking@tremily.us>
|
||||||
|
|
@ -2087,6 +2227,7 @@ Wade Simmons <wade@wades.im>
|
||||||
Wagner Riffel <wgrriffel@gmail.com>
|
Wagner Riffel <wgrriffel@gmail.com>
|
||||||
Walter Poupore <wpoupore@google.com>
|
Walter Poupore <wpoupore@google.com>
|
||||||
Wander Lairson Costa <wcosta@mozilla.com>
|
Wander Lairson Costa <wcosta@mozilla.com>
|
||||||
|
Wang Xuerui <git@xen0n.name>
|
||||||
Warren Fernandes <warren.f.fernandes@gmail.com>
|
Warren Fernandes <warren.f.fernandes@gmail.com>
|
||||||
Wayne Ashley Berry <wayneashleyberry@gmail.com>
|
Wayne Ashley Berry <wayneashleyberry@gmail.com>
|
||||||
Wedson Almeida Filho <wedsonaf@google.com>
|
Wedson Almeida Filho <wedsonaf@google.com>
|
||||||
|
|
@ -2113,11 +2254,14 @@ William Chan <willchan@chromium.org>
|
||||||
William Chang <mr.williamchang@gmail.com>
|
William Chang <mr.williamchang@gmail.com>
|
||||||
William Josephson <wjosephson@gmail.com>
|
William Josephson <wjosephson@gmail.com>
|
||||||
William Orr <will@worrbase.com> <ay1244@gmail.com>
|
William Orr <will@worrbase.com> <ay1244@gmail.com>
|
||||||
|
William Poussier <william.poussier@gmail.com>
|
||||||
Wisdom Omuya <deafgoat@gmail.com>
|
Wisdom Omuya <deafgoat@gmail.com>
|
||||||
Wu Yunzhou <yunzhouwu@gmail.com>
|
Wu Yunzhou <yunzhouwu@gmail.com>
|
||||||
Xi Ruoyao <xry23333@gmail.com>
|
Xi Ruoyao <xry23333@gmail.com>
|
||||||
Xia Bin <snyh@snyh.org>
|
Xia Bin <snyh@snyh.org>
|
||||||
|
Xiangdong Ji <xiangdong.ji@arm.com>
|
||||||
Xing Xing <mikespook@gmail.com>
|
Xing Xing <mikespook@gmail.com>
|
||||||
|
Xingqang Bai <bxq2011hust@qq.com>
|
||||||
Xu Fei <badgangkiller@gmail.com>
|
Xu Fei <badgangkiller@gmail.com>
|
||||||
Xudong Zhang <felixmelon@gmail.com>
|
Xudong Zhang <felixmelon@gmail.com>
|
||||||
Xudong Zheng <7pkvm5aw@slicealias.com>
|
Xudong Zheng <7pkvm5aw@slicealias.com>
|
||||||
|
|
@ -2148,6 +2292,7 @@ Yoshiyuki Mineo <yoshiyuki.mineo@gmail.com>
|
||||||
Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
|
Yosuke Akatsuka <yosuke.akatsuka@gmail.com>
|
||||||
Yu Heng Zhang <annita.zhang@cn.ibm.com>
|
Yu Heng Zhang <annita.zhang@cn.ibm.com>
|
||||||
Yu Xuan Zhang <zyxsh@cn.ibm.com>
|
Yu Xuan Zhang <zyxsh@cn.ibm.com>
|
||||||
|
Yuichi Nishiwaki <yuichi.nishiwaki@gmail.com>
|
||||||
Yuji Yaginuma <yuuji.yaginuma@gmail.com>
|
Yuji Yaginuma <yuuji.yaginuma@gmail.com>
|
||||||
Yuki OKUSHI <huyuumi.dev@gmail.com>
|
Yuki OKUSHI <huyuumi.dev@gmail.com>
|
||||||
Yuki Yugui Sonoda <yugui@google.com>
|
Yuki Yugui Sonoda <yugui@google.com>
|
||||||
|
|
@ -2175,6 +2320,7 @@ Zhongtao Chen <chenzhongtao@126.com>
|
||||||
Zhongwei Yao <zhongwei.yao@arm.com>
|
Zhongwei Yao <zhongwei.yao@arm.com>
|
||||||
Zhou Peng <p@ctriple.cn>
|
Zhou Peng <p@ctriple.cn>
|
||||||
Ziad Hatahet <hatahet@gmail.com>
|
Ziad Hatahet <hatahet@gmail.com>
|
||||||
|
Ziheng Liu <lzhfromustc@gmail.com>
|
||||||
Zorion Arrizabalaga <zorionk@gmail.com>
|
Zorion Arrizabalaga <zorionk@gmail.com>
|
||||||
Максадбек Ахмедов <a.maksadbek@gmail.com>
|
Максадбек Ахмедов <a.maksadbek@gmail.com>
|
||||||
Максим Федосеев <max.faceless.frei@gmail.com>
|
Максим Федосеев <max.faceless.frei@gmail.com>
|
||||||
|
|
|
||||||
197
api/go1.14.txt
Normal file
197
api/go1.14.txt
Normal file
|
|
@ -0,0 +1,197 @@
|
||||||
|
pkg crypto/tls, const TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 52393
|
||||||
|
pkg crypto/tls, const TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 uint16
|
||||||
|
pkg crypto/tls, const TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 52392
|
||||||
|
pkg crypto/tls, const TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 uint16
|
||||||
|
pkg crypto/tls, func CipherSuiteName(uint16) string
|
||||||
|
pkg crypto/tls, func CipherSuites() []*CipherSuite
|
||||||
|
pkg crypto/tls, func InsecureCipherSuites() []*CipherSuite
|
||||||
|
pkg crypto/tls, method (*CertificateRequestInfo) SupportsCertificate(*Certificate) error
|
||||||
|
pkg crypto/tls, method (*ClientHelloInfo) SupportsCertificate(*Certificate) error
|
||||||
|
pkg crypto/tls, type Certificate struct, SupportedSignatureAlgorithms []SignatureScheme
|
||||||
|
pkg crypto/tls, type CertificateRequestInfo struct, Version uint16
|
||||||
|
pkg crypto/tls, type CipherSuite struct
|
||||||
|
pkg crypto/tls, type CipherSuite struct, ID uint16
|
||||||
|
pkg crypto/tls, type CipherSuite struct, Insecure bool
|
||||||
|
pkg crypto/tls, type CipherSuite struct, Name string
|
||||||
|
pkg crypto/tls, type CipherSuite struct, SupportedVersions []uint16
|
||||||
|
pkg debug/dwarf, const AttrAddrBase = 115
|
||||||
|
pkg debug/dwarf, const AttrAddrBase Attr
|
||||||
|
pkg debug/dwarf, const AttrAlignment = 136
|
||||||
|
pkg debug/dwarf, const AttrAlignment Attr
|
||||||
|
pkg debug/dwarf, const AttrBinaryScale = 91
|
||||||
|
pkg debug/dwarf, const AttrBinaryScale Attr
|
||||||
|
pkg debug/dwarf, const AttrCallAllCalls = 122
|
||||||
|
pkg debug/dwarf, const AttrCallAllCalls Attr
|
||||||
|
pkg debug/dwarf, const AttrCallAllSourceCalls = 123
|
||||||
|
pkg debug/dwarf, const AttrCallAllSourceCalls Attr
|
||||||
|
pkg debug/dwarf, const AttrCallAllTailCalls = 124
|
||||||
|
pkg debug/dwarf, const AttrCallAllTailCalls Attr
|
||||||
|
pkg debug/dwarf, const AttrCallDataLocation = 133
|
||||||
|
pkg debug/dwarf, const AttrCallDataLocation Attr
|
||||||
|
pkg debug/dwarf, const AttrCallDataValue = 134
|
||||||
|
pkg debug/dwarf, const AttrCallDataValue Attr
|
||||||
|
pkg debug/dwarf, const AttrCallOrigin = 127
|
||||||
|
pkg debug/dwarf, const AttrCallOrigin Attr
|
||||||
|
pkg debug/dwarf, const AttrCallPC = 129
|
||||||
|
pkg debug/dwarf, const AttrCallPC Attr
|
||||||
|
pkg debug/dwarf, const AttrCallParameter = 128
|
||||||
|
pkg debug/dwarf, const AttrCallParameter Attr
|
||||||
|
pkg debug/dwarf, const AttrCallReturnPC = 125
|
||||||
|
pkg debug/dwarf, const AttrCallReturnPC Attr
|
||||||
|
pkg debug/dwarf, const AttrCallTailCall = 130
|
||||||
|
pkg debug/dwarf, const AttrCallTailCall Attr
|
||||||
|
pkg debug/dwarf, const AttrCallTarget = 131
|
||||||
|
pkg debug/dwarf, const AttrCallTarget Attr
|
||||||
|
pkg debug/dwarf, const AttrCallTargetClobbered = 132
|
||||||
|
pkg debug/dwarf, const AttrCallTargetClobbered Attr
|
||||||
|
pkg debug/dwarf, const AttrCallValue = 126
|
||||||
|
pkg debug/dwarf, const AttrCallValue Attr
|
||||||
|
pkg debug/dwarf, const AttrConstExpr = 108
|
||||||
|
pkg debug/dwarf, const AttrConstExpr Attr
|
||||||
|
pkg debug/dwarf, const AttrDataBitOffset = 107
|
||||||
|
pkg debug/dwarf, const AttrDataBitOffset Attr
|
||||||
|
pkg debug/dwarf, const AttrDecimalScale = 92
|
||||||
|
pkg debug/dwarf, const AttrDecimalScale Attr
|
||||||
|
pkg debug/dwarf, const AttrDecimalSign = 94
|
||||||
|
pkg debug/dwarf, const AttrDecimalSign Attr
|
||||||
|
pkg debug/dwarf, const AttrDefaulted = 139
|
||||||
|
pkg debug/dwarf, const AttrDefaulted Attr
|
||||||
|
pkg debug/dwarf, const AttrDeleted = 138
|
||||||
|
pkg debug/dwarf, const AttrDeleted Attr
|
||||||
|
pkg debug/dwarf, const AttrDigitCount = 95
|
||||||
|
pkg debug/dwarf, const AttrDigitCount Attr
|
||||||
|
pkg debug/dwarf, const AttrDwoName = 118
|
||||||
|
pkg debug/dwarf, const AttrDwoName Attr
|
||||||
|
pkg debug/dwarf, const AttrElemental = 102
|
||||||
|
pkg debug/dwarf, const AttrElemental Attr
|
||||||
|
pkg debug/dwarf, const AttrEndianity = 101
|
||||||
|
pkg debug/dwarf, const AttrEndianity Attr
|
||||||
|
pkg debug/dwarf, const AttrEnumClass = 109
|
||||||
|
pkg debug/dwarf, const AttrEnumClass Attr
|
||||||
|
pkg debug/dwarf, const AttrExplicit = 99
|
||||||
|
pkg debug/dwarf, const AttrExplicit Attr
|
||||||
|
pkg debug/dwarf, const AttrExportSymbols = 137
|
||||||
|
pkg debug/dwarf, const AttrExportSymbols Attr
|
||||||
|
pkg debug/dwarf, const AttrLinkageName = 110
|
||||||
|
pkg debug/dwarf, const AttrLinkageName Attr
|
||||||
|
pkg debug/dwarf, const AttrLoclistsBase = 140
|
||||||
|
pkg debug/dwarf, const AttrLoclistsBase Attr
|
||||||
|
pkg debug/dwarf, const AttrMacros = 121
|
||||||
|
pkg debug/dwarf, const AttrMacros Attr
|
||||||
|
pkg debug/dwarf, const AttrMainSubprogram = 106
|
||||||
|
pkg debug/dwarf, const AttrMainSubprogram Attr
|
||||||
|
pkg debug/dwarf, const AttrMutable = 97
|
||||||
|
pkg debug/dwarf, const AttrMutable Attr
|
||||||
|
pkg debug/dwarf, const AttrNoreturn = 135
|
||||||
|
pkg debug/dwarf, const AttrNoreturn Attr
|
||||||
|
pkg debug/dwarf, const AttrObjectPointer = 100
|
||||||
|
pkg debug/dwarf, const AttrObjectPointer Attr
|
||||||
|
pkg debug/dwarf, const AttrPictureString = 96
|
||||||
|
pkg debug/dwarf, const AttrPictureString Attr
|
||||||
|
pkg debug/dwarf, const AttrPure = 103
|
||||||
|
pkg debug/dwarf, const AttrPure Attr
|
||||||
|
pkg debug/dwarf, const AttrRank = 113
|
||||||
|
pkg debug/dwarf, const AttrRank Attr
|
||||||
|
pkg debug/dwarf, const AttrRecursive = 104
|
||||||
|
pkg debug/dwarf, const AttrRecursive Attr
|
||||||
|
pkg debug/dwarf, const AttrReference = 119
|
||||||
|
pkg debug/dwarf, const AttrReference Attr
|
||||||
|
pkg debug/dwarf, const AttrRnglistsBase = 116
|
||||||
|
pkg debug/dwarf, const AttrRnglistsBase Attr
|
||||||
|
pkg debug/dwarf, const AttrRvalueReference = 120
|
||||||
|
pkg debug/dwarf, const AttrRvalueReference Attr
|
||||||
|
pkg debug/dwarf, const AttrSignature = 105
|
||||||
|
pkg debug/dwarf, const AttrSignature Attr
|
||||||
|
pkg debug/dwarf, const AttrSmall = 93
|
||||||
|
pkg debug/dwarf, const AttrSmall Attr
|
||||||
|
pkg debug/dwarf, const AttrStrOffsetsBase = 114
|
||||||
|
pkg debug/dwarf, const AttrStrOffsetsBase Attr
|
||||||
|
pkg debug/dwarf, const AttrStringLengthBitSize = 111
|
||||||
|
pkg debug/dwarf, const AttrStringLengthBitSize Attr
|
||||||
|
pkg debug/dwarf, const AttrStringLengthByteSize = 112
|
||||||
|
pkg debug/dwarf, const AttrStringLengthByteSize Attr
|
||||||
|
pkg debug/dwarf, const AttrThreadsScaled = 98
|
||||||
|
pkg debug/dwarf, const AttrThreadsScaled Attr
|
||||||
|
pkg debug/dwarf, const ClassAddrPtr = 15
|
||||||
|
pkg debug/dwarf, const ClassAddrPtr Class
|
||||||
|
pkg debug/dwarf, const ClassLocList = 16
|
||||||
|
pkg debug/dwarf, const ClassLocList Class
|
||||||
|
pkg debug/dwarf, const ClassRngList = 17
|
||||||
|
pkg debug/dwarf, const ClassRngList Class
|
||||||
|
pkg debug/dwarf, const ClassRngListsPtr = 18
|
||||||
|
pkg debug/dwarf, const ClassRngListsPtr Class
|
||||||
|
pkg debug/dwarf, const ClassStrOffsetsPtr = 19
|
||||||
|
pkg debug/dwarf, const ClassStrOffsetsPtr Class
|
||||||
|
pkg debug/dwarf, const TagAtomicType = 71
|
||||||
|
pkg debug/dwarf, const TagAtomicType Tag
|
||||||
|
pkg debug/dwarf, const TagCallSite = 72
|
||||||
|
pkg debug/dwarf, const TagCallSite Tag
|
||||||
|
pkg debug/dwarf, const TagCallSiteParameter = 73
|
||||||
|
pkg debug/dwarf, const TagCallSiteParameter Tag
|
||||||
|
pkg debug/dwarf, const TagCoarrayType = 68
|
||||||
|
pkg debug/dwarf, const TagCoarrayType Tag
|
||||||
|
pkg debug/dwarf, const TagDynamicType = 70
|
||||||
|
pkg debug/dwarf, const TagDynamicType Tag
|
||||||
|
pkg debug/dwarf, const TagGenericSubrange = 69
|
||||||
|
pkg debug/dwarf, const TagGenericSubrange Tag
|
||||||
|
pkg debug/dwarf, const TagImmutableType = 75
|
||||||
|
pkg debug/dwarf, const TagImmutableType Tag
|
||||||
|
pkg debug/dwarf, const TagSkeletonUnit = 74
|
||||||
|
pkg debug/dwarf, const TagSkeletonUnit Tag
|
||||||
|
pkg debug/dwarf, method (*Data) AddSection(string, []uint8) error
|
||||||
|
pkg debug/dwarf, method (*LineReader) Files() []*LineFile
|
||||||
|
pkg debug/dwarf, method (*Reader) ByteOrder() binary.ByteOrder
|
||||||
|
pkg encoding/asn1, const TagBMPString = 30
|
||||||
|
pkg encoding/asn1, const TagBMPString ideal-int
|
||||||
|
pkg encoding/json, method (*Decoder) InputOffset() int64
|
||||||
|
pkg go/build, type Context struct, Dir string
|
||||||
|
pkg go/doc, func NewFromFiles(*token.FileSet, []*ast.File, string, ...interface{}) (*Package, error)
|
||||||
|
pkg go/doc, type Example struct, Suffix string
|
||||||
|
pkg go/doc, type Func struct, Examples []*Example
|
||||||
|
pkg go/doc, type Package struct, Examples []*Example
|
||||||
|
pkg go/doc, type Type struct, Examples []*Example
|
||||||
|
pkg hash/maphash, func MakeSeed() Seed
|
||||||
|
pkg hash/maphash, method (*Hash) BlockSize() int
|
||||||
|
pkg hash/maphash, method (*Hash) Reset()
|
||||||
|
pkg hash/maphash, method (*Hash) Seed() Seed
|
||||||
|
pkg hash/maphash, method (*Hash) SetSeed(Seed)
|
||||||
|
pkg hash/maphash, method (*Hash) Size() int
|
||||||
|
pkg hash/maphash, method (*Hash) Sum([]uint8) []uint8
|
||||||
|
pkg hash/maphash, method (*Hash) Sum64() uint64
|
||||||
|
pkg hash/maphash, method (*Hash) Write([]uint8) (int, error)
|
||||||
|
pkg hash/maphash, method (*Hash) WriteByte(uint8) error
|
||||||
|
pkg hash/maphash, method (*Hash) WriteString(string) (int, error)
|
||||||
|
pkg hash/maphash, type Hash struct
|
||||||
|
pkg hash/maphash, type Seed struct
|
||||||
|
pkg log, const Lmsgprefix = 64
|
||||||
|
pkg log, const Lmsgprefix ideal-int
|
||||||
|
pkg math, func FMA(float64, float64, float64) float64
|
||||||
|
pkg math/bits, func Rem(uint, uint, uint) uint
|
||||||
|
pkg math/bits, func Rem32(uint32, uint32, uint32) uint32
|
||||||
|
pkg math/bits, func Rem64(uint64, uint64, uint64) uint64
|
||||||
|
pkg mime/multipart, method (*Reader) NextRawPart() (*Part, error)
|
||||||
|
pkg net/http, method (Header) Values(string) []string
|
||||||
|
pkg net/http, type Transport struct, DialTLSContext func(context.Context, string, string) (net.Conn, error)
|
||||||
|
pkg net/http/httptest, type Server struct, EnableHTTP2 bool
|
||||||
|
pkg net/textproto, method (MIMEHeader) Values(string) []string
|
||||||
|
pkg strconv, method (*NumError) Unwrap() error
|
||||||
|
pkg syscall (windows-386), const CTRL_CLOSE_EVENT = 2
|
||||||
|
pkg syscall (windows-386), const CTRL_CLOSE_EVENT ideal-int
|
||||||
|
pkg syscall (windows-386), const CTRL_LOGOFF_EVENT = 5
|
||||||
|
pkg syscall (windows-386), const CTRL_LOGOFF_EVENT ideal-int
|
||||||
|
pkg syscall (windows-386), const CTRL_SHUTDOWN_EVENT = 6
|
||||||
|
pkg syscall (windows-386), const CTRL_SHUTDOWN_EVENT ideal-int
|
||||||
|
pkg syscall (windows-amd64), const CTRL_CLOSE_EVENT = 2
|
||||||
|
pkg syscall (windows-amd64), const CTRL_CLOSE_EVENT ideal-int
|
||||||
|
pkg syscall (windows-amd64), const CTRL_LOGOFF_EVENT = 5
|
||||||
|
pkg syscall (windows-amd64), const CTRL_LOGOFF_EVENT ideal-int
|
||||||
|
pkg syscall (windows-amd64), const CTRL_SHUTDOWN_EVENT = 6
|
||||||
|
pkg syscall (windows-amd64), const CTRL_SHUTDOWN_EVENT ideal-int
|
||||||
|
pkg testing, method (*B) Cleanup(func())
|
||||||
|
pkg testing, method (*T) Cleanup(func())
|
||||||
|
pkg testing, type TB interface, Cleanup(func())
|
||||||
|
pkg unicode, const Version = "12.0.0"
|
||||||
|
pkg unicode, var Elymaic *RangeTable
|
||||||
|
pkg unicode, var Nandinagari *RangeTable
|
||||||
|
pkg unicode, var Nyiakeng_Puachue_Hmong *RangeTable
|
||||||
|
pkg unicode, var Wancho *RangeTable
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
pkg unicode, const Version = "12.0.0"
|
pkg testing, method (*T) Deadline() (time.Time, bool)
|
||||||
pkg unicode, var Elymaic *RangeTable
|
pkg time, method (*Ticker) Reset(Duration)
|
||||||
pkg unicode, var Nandinagari *RangeTable
|
pkg sync, method (*Map) LoadAndDelete(interface{}) (interface{}, bool)
|
||||||
pkg unicode, var Nyiakeng_Puachue_Hmong *RangeTable
|
|
||||||
pkg unicode, var Wancho *RangeTable
|
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ important, the use of the tool itself.</p>
|
||||||
<p>The <code>go</code> command requires that code adheres to a few key,
|
<p>The <code>go</code> command requires that code adheres to a few key,
|
||||||
well-established conventions.</p>
|
well-established conventions.</p>
|
||||||
|
|
||||||
<p>First, the import path is derived in an known way from the URL of the
|
<p>First, the import path is derived in a known way from the URL of the
|
||||||
source code. For Bitbucket, GitHub, Google Code, and Launchpad, the
|
source code. For Bitbucket, GitHub, Google Code, and Launchpad, the
|
||||||
root directory of the repository is identified by the repository's
|
root directory of the repository is identified by the repository's
|
||||||
main URL, without the <code>http://</code> prefix. Subdirectories are named by
|
main URL, without the <code>http://</code> prefix. Subdirectories are named by
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,11 @@ cost of increased memory usage.
|
||||||
<code>halt_on_error</code> (default <code>0</code>): Controls whether the program
|
<code>halt_on_error</code> (default <code>0</code>): Controls whether the program
|
||||||
exits after reporting first data race.
|
exits after reporting first data race.
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<code>atexit_sleep_ms</code> (default <code>1000</code>): Amount of milliseconds
|
||||||
|
to sleep in the main goroutine before exiting.
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -374,6 +379,38 @@ func (w *Watchdog) Start() {
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
<h3 id="Unsynchronized_send_and_close_operations">Unsynchronized send and close operations</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As this example demonstrates, unsynchronized send and close operations
|
||||||
|
on the same channel can also be a race condition:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
c := make(chan struct{}) // or buffered channel
|
||||||
|
|
||||||
|
// The race detector cannot derive the happens before relation
|
||||||
|
// for the following send and close operations. These two operations
|
||||||
|
// are unsynchronized and happen concurrently.
|
||||||
|
go func() { c <- struct{}{} }()
|
||||||
|
close(c)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
According to the Go memory model, a send on a channel happens before
|
||||||
|
the corresponding receive from that channel completes. To synchronize
|
||||||
|
send and close operations, use a receive operation that guarantees
|
||||||
|
the send is done before the close:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
c := make(chan struct{}) // or buffered channel
|
||||||
|
|
||||||
|
go func() { c <- struct{}{} }()
|
||||||
|
<-c
|
||||||
|
close(c)
|
||||||
|
</pre>
|
||||||
|
|
||||||
<h2 id="Supported_Systems">Supported Systems</h2>
|
<h2 id="Supported_Systems">Supported Systems</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -390,3 +427,14 @@ func (w *Watchdog) Start() {
|
||||||
The cost of race detection varies by program, but for a typical program, memory
|
The cost of race detection varies by program, but for a typical program, memory
|
||||||
usage may increase by 5-10x and execution time by 2-20x.
|
usage may increase by 5-10x and execution time by 2-20x.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The race detector currently allocates an extra 8 bytes per <code>defer</code>
|
||||||
|
and <code>recover</code> statement. Those extra allocations <a
|
||||||
|
href="https://golang.org/issue/26813">are not recovered until the goroutine
|
||||||
|
exits</a>. This means that if you have a long-running goroutine that is
|
||||||
|
periodically issuing <code>defer</code> and <code>recover</code> calls,
|
||||||
|
the program memory usage may grow without bound. These memory allocations
|
||||||
|
will not show up in the output of <code>runtime.ReadMemStats</code> or
|
||||||
|
<code>runtime/pprof</code>.
|
||||||
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
--- final.go 2017-08-31 13:19:00.422925489 -0700
|
|
||||||
+++ final-test.go 2017-08-31 13:23:43.381391659 -0700
|
|
||||||
@@ -8,6 +8,7 @@
|
|
||||||
"html/template"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
+ "net"
|
|
||||||
"net/http"
|
|
||||||
"regexp"
|
|
||||||
)
|
|
||||||
@@ -86,5 +87,15 @@
|
|
||||||
http.HandleFunc("/edit/", makeHandler(editHandler))
|
|
||||||
http.HandleFunc("/save/", makeHandler(saveHandler))
|
|
||||||
|
|
||||||
- log.Fatal(http.ListenAndServe(":8080", nil))
|
|
||||||
+ l, err := net.Listen("tcp", "127.0.0.1:0")
|
|
||||||
+ if err != nil {
|
|
||||||
+ log.Fatal(err)
|
|
||||||
+ }
|
|
||||||
+ err = ioutil.WriteFile("final-test-port.txt", []byte(l.Addr().String()), 0644)
|
|
||||||
+ if err != nil {
|
|
||||||
+ log.Fatal(err)
|
|
||||||
+ }
|
|
||||||
+ s := &http.Server{}
|
|
||||||
+ s.Serve(l)
|
|
||||||
+ return
|
|
||||||
}
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
24
doc/articles/wiki/final_test.go
Normal file
24
doc/articles/wiki/final_test.go
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func serve() error {
|
||||||
|
l, err := net.Listen("tcp", "127.0.0.1:0")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(l.Addr().String())
|
||||||
|
s := &http.Server{}
|
||||||
|
return s.Serve(l)
|
||||||
|
}
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
post = flag.String("post", "", "urlencoded form data to POST")
|
|
||||||
addr = flag.Bool("addr", false, "find open address and print to stdout")
|
|
||||||
wait = flag.Duration("wait_for_port", 0, "if non-zero, the amount of time to wait for the address to become available")
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
if *addr {
|
|
||||||
l, err := net.Listen("tcp", "127.0.0.1:0")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer l.Close()
|
|
||||||
fmt.Print(l.Addr())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
url := flag.Arg(0)
|
|
||||||
if url == "" {
|
|
||||||
log.Fatal("no url supplied")
|
|
||||||
}
|
|
||||||
var r *http.Response
|
|
||||||
var err error
|
|
||||||
loopUntil := time.Now().Add(*wait)
|
|
||||||
for {
|
|
||||||
if *post != "" {
|
|
||||||
b := strings.NewReader(*post)
|
|
||||||
r, err = http.Post(url, "application/x-www-form-urlencoded", b)
|
|
||||||
} else {
|
|
||||||
r, err = http.Get(url)
|
|
||||||
}
|
|
||||||
if err == nil || *wait == 0 || time.Now().After(loopUntil) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
time.Sleep(100 * time.Millisecond)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer r.Body.Close()
|
|
||||||
_, err = io.Copy(os.Stdout, r.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3
doc/articles/wiki/go.mod
Normal file
3
doc/articles/wiki/go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
module doc/articles/wiki
|
||||||
|
|
||||||
|
go 1.14
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -674,7 +674,7 @@ The closure returned by <code>makeHandler</code> is a function that takes
|
||||||
an <code>http.ResponseWriter</code> and <code>http.Request</code> (in other
|
an <code>http.ResponseWriter</code> and <code>http.Request</code> (in other
|
||||||
words, an <code>http.HandlerFunc</code>).
|
words, an <code>http.HandlerFunc</code>).
|
||||||
The closure extracts the <code>title</code> from the request path, and
|
The closure extracts the <code>title</code> from the request path, and
|
||||||
validates it with the <code>TitleValidator</code> regexp. If the
|
validates it with the <code>validPath</code> regexp. If the
|
||||||
<code>title</code> is invalid, an error will be written to the
|
<code>title</code> is invalid, an error will be written to the
|
||||||
<code>ResponseWriter</code> using the <code>http.NotFound</code> function.
|
<code>ResponseWriter</code> using the <code>http.NotFound</code> function.
|
||||||
If the <code>title</code> is valid, the enclosed handler function
|
If the <code>title</code> is valid, the enclosed handler function
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if ! which patch > /dev/null; then
|
|
||||||
echo "Skipping test; patch command not found."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
wiki_pid=
|
|
||||||
cleanup() {
|
|
||||||
kill $wiki_pid
|
|
||||||
rm -f test_*.out Test.txt final-test.go final-test.bin final-test-port.txt a.out get.bin
|
|
||||||
}
|
|
||||||
trap cleanup 0 INT
|
|
||||||
|
|
||||||
rm -f get.bin final-test.bin a.out
|
|
||||||
|
|
||||||
# If called with -all, check that all code snippets compile.
|
|
||||||
if [ "$1" = "-all" ]; then
|
|
||||||
for fn in *.go; do
|
|
||||||
go build -o a.out $fn
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
go build -o get.bin get.go
|
|
||||||
cp final.go final-test.go
|
|
||||||
patch final-test.go final-test.patch > /dev/null
|
|
||||||
go build -o final-test.bin final-test.go
|
|
||||||
./final-test.bin &
|
|
||||||
wiki_pid=$!
|
|
||||||
|
|
||||||
l=0
|
|
||||||
while [ ! -f ./final-test-port.txt ]
|
|
||||||
do
|
|
||||||
l=$(($l+1))
|
|
||||||
if [ "$l" -gt 5 ]
|
|
||||||
then
|
|
||||||
echo "port not available within 5 seconds"
|
|
||||||
exit 1
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
addr=$(cat final-test-port.txt)
|
|
||||||
./get.bin http://$addr/edit/Test > test_edit.out
|
|
||||||
diff -u test_edit.out test_edit.good
|
|
||||||
./get.bin -post=body=some%20content http://$addr/save/Test > test_save.out
|
|
||||||
diff -u test_save.out test_view.good # should be the same as viewing
|
|
||||||
diff -u Test.txt test_Test.txt.good
|
|
||||||
./get.bin http://$addr/view/Test > test_view.out
|
|
||||||
diff -u test_view.out test_view.good
|
|
||||||
|
|
||||||
echo PASS
|
|
||||||
165
doc/articles/wiki/wiki_test.go
Normal file
165
doc/articles/wiki/wiki_test.go
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSnippetsCompile(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping slow builds in short mode")
|
||||||
|
}
|
||||||
|
|
||||||
|
goFiles, err := filepath.Glob("*.go")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range goFiles {
|
||||||
|
if strings.HasSuffix(f, "_test.go") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
f := f
|
||||||
|
t.Run(f, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "build", "-o", os.DevNull, f)
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWikiServer(t *testing.T) {
|
||||||
|
must := func(err error) {
|
||||||
|
if err != nil {
|
||||||
|
t.Helper()
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir("", t.Name())
|
||||||
|
must(err)
|
||||||
|
defer os.RemoveAll(dir)
|
||||||
|
|
||||||
|
// We're testing a walkthrough example of how to write a server.
|
||||||
|
//
|
||||||
|
// That server hard-codes a port number to make the walkthrough simpler, but
|
||||||
|
// we can't assume that the hard-coded port is available on an arbitrary
|
||||||
|
// builder. So we'll patch out the hard-coded port, and replace it with a
|
||||||
|
// function that writes the server's address to stdout
|
||||||
|
// so that we can read it and know where to send the test requests.
|
||||||
|
|
||||||
|
finalGo, err := ioutil.ReadFile("final.go")
|
||||||
|
must(err)
|
||||||
|
const patchOld = `log.Fatal(http.ListenAndServe(":8080", nil))`
|
||||||
|
patched := bytes.ReplaceAll(finalGo, []byte(patchOld), []byte(`log.Fatal(serve())`))
|
||||||
|
if bytes.Equal(patched, finalGo) {
|
||||||
|
t.Fatalf("Can't patch final.go: %q not found.", patchOld)
|
||||||
|
}
|
||||||
|
must(ioutil.WriteFile(filepath.Join(dir, "final_patched.go"), patched, 0644))
|
||||||
|
|
||||||
|
// Build the server binary from the patched sources.
|
||||||
|
// The 'go' command requires that they all be in the same directory.
|
||||||
|
// final_test.go provides the implemtation for our serve function.
|
||||||
|
must(copyFile(filepath.Join(dir, "final_srv.go"), "final_test.go"))
|
||||||
|
cmd := exec.Command("go", "build",
|
||||||
|
"-o", filepath.Join(dir, "final.exe"),
|
||||||
|
filepath.Join(dir, "final_patched.go"),
|
||||||
|
filepath.Join(dir, "final_srv.go"))
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the server in our temporary directory so that it can
|
||||||
|
// write its content there. It also needs a couple of template files,
|
||||||
|
// and looks for them in the same directory.
|
||||||
|
must(copyFile(filepath.Join(dir, "edit.html"), "edit.html"))
|
||||||
|
must(copyFile(filepath.Join(dir, "view.html"), "view.html"))
|
||||||
|
cmd = exec.Command(filepath.Join(dir, "final.exe"))
|
||||||
|
cmd.Dir = dir
|
||||||
|
stderr := bytes.NewBuffer(nil)
|
||||||
|
cmd.Stderr = stderr
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
must(err)
|
||||||
|
must(cmd.Start())
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
cmd.Process.Kill()
|
||||||
|
err := cmd.Wait()
|
||||||
|
if stderr.Len() > 0 {
|
||||||
|
t.Logf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, stderr)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
var addr string
|
||||||
|
if _, err := fmt.Fscanln(stdout, &addr); err != nil || addr == "" {
|
||||||
|
t.Fatalf("Failed to read server address: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The server is up and has told us its address.
|
||||||
|
// Make sure that its HTTP API works as described in the article.
|
||||||
|
|
||||||
|
r, err := http.Get(fmt.Sprintf("http://%s/edit/Test", addr))
|
||||||
|
must(err)
|
||||||
|
responseMustMatchFile(t, r, "test_edit.good")
|
||||||
|
|
||||||
|
r, err = http.Post(fmt.Sprintf("http://%s/save/Test", addr),
|
||||||
|
"application/x-www-form-urlencoded",
|
||||||
|
strings.NewReader("body=some%20content"))
|
||||||
|
must(err)
|
||||||
|
responseMustMatchFile(t, r, "test_view.good")
|
||||||
|
|
||||||
|
gotTxt, err := ioutil.ReadFile(filepath.Join(dir, "Test.txt"))
|
||||||
|
must(err)
|
||||||
|
wantTxt, err := ioutil.ReadFile("test_Test.txt.good")
|
||||||
|
must(err)
|
||||||
|
if !bytes.Equal(wantTxt, gotTxt) {
|
||||||
|
t.Fatalf("Test.txt differs from expected after posting to /save.\ngot:\n%s\nwant:\n%s", gotTxt, wantTxt)
|
||||||
|
}
|
||||||
|
|
||||||
|
r, err = http.Get(fmt.Sprintf("http://%s/view/Test", addr))
|
||||||
|
must(err)
|
||||||
|
responseMustMatchFile(t, r, "test_view.good")
|
||||||
|
}
|
||||||
|
|
||||||
|
func responseMustMatchFile(t *testing.T, r *http.Response, filename string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
defer r.Body.Close()
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
wantBody, err := ioutil.ReadFile(filename)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(body, wantBody) {
|
||||||
|
t.Fatalf("%v: body does not match %s.\ngot:\n%s\nwant:\n%s", r.Request.URL, filename, body, wantBody)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFile(dst, src string) error {
|
||||||
|
buf, err := ioutil.ReadFile(src)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return ioutil.WriteFile(dst, buf, 0644)
|
||||||
|
}
|
||||||
|
|
@ -49,7 +49,6 @@ The <code>go</code> program manages Go source code and runs the other
|
||||||
commands listed here.
|
commands listed here.
|
||||||
See the command docs for usage
|
See the command docs for usage
|
||||||
details.
|
details.
|
||||||
<br><br>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
|
||||||
52
doc/codewalk/codewalk_test.go
Normal file
52
doc/codewalk/codewalk_test.go
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestMarkov tests the code dependency of markov.xml.
|
||||||
|
func TestMarkov(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "run", "markov.go")
|
||||||
|
cmd.Stdin = strings.NewReader("foo")
|
||||||
|
cmd.Stderr = bytes.NewBuffer(nil)
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !bytes.Equal(out, []byte("foo\n")) {
|
||||||
|
t.Fatalf(`%s with input "foo" did not output "foo":\n%s`, strings.Join(cmd.Args, " "), out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestPig tests the code dependency of functions.xml.
|
||||||
|
func TestPig(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "run", "pig.go")
|
||||||
|
cmd.Stderr = bytes.NewBuffer(nil)
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
|
||||||
|
}
|
||||||
|
|
||||||
|
const want = "Wins, losses staying at k = 100: 210/990 (21.2%), 780/990 (78.8%)\n"
|
||||||
|
if !bytes.Contains(out, []byte(want)) {
|
||||||
|
t.Fatalf(`%s: unexpected output\ngot:\n%s\nwant output containing:\n%s`, strings.Join(cmd.Args, " "), out, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestURLPoll tests the code dependency of sharemem.xml.
|
||||||
|
func TestURLPoll(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "build", "-o", os.DevNull, "urlpoll.go")
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright 2013 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
function fail {
|
|
||||||
echo FAIL: doc/codewalk/$1
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# markov.xml
|
|
||||||
echo foo | go run markov.go | grep foo > /dev/null || fail markov
|
|
||||||
|
|
||||||
# functions.xml
|
|
||||||
go run pig.go | grep 'Wins, losses staying at k = 100: 210/990 (21.2%), 780/990 (78.8%)' > /dev/null || fail pig
|
|
||||||
|
|
||||||
# sharemem.xml: only build the example, as it uses the network
|
|
||||||
go build urlpoll.go || fail urlpoll
|
|
||||||
rm -f urlpoll
|
|
||||||
211
doc/conduct.html
211
doc/conduct.html
|
|
@ -1,211 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Title": "Go Community Code of Conduct",
|
|
||||||
"Path": "/conduct",
|
|
||||||
"Template": true
|
|
||||||
}-->
|
|
||||||
|
|
||||||
<style>
|
|
||||||
ul {
|
|
||||||
max-width: 800px;
|
|
||||||
}
|
|
||||||
ul ul {
|
|
||||||
margin: 0 0 5px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<h2 id="about">About</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Online communities include people from many different backgrounds.
|
|
||||||
The Go contributors are committed to providing a friendly, safe and welcoming
|
|
||||||
environment for all, regardless of gender identity and expression, sexual orientation,
|
|
||||||
disabilities, neurodiversity, physical appearance, body size, ethnicity, nationality,
|
|
||||||
race, age, religion, or similar personal characteristics.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The first goal of the Code of Conduct is to specify a baseline standard
|
|
||||||
of behavior so that people with different social values and communication
|
|
||||||
styles can talk about Go effectively, productively, and respectfully.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The second goal is to provide a mechanism for resolving conflicts in the
|
|
||||||
community when they arise.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The third goal of the Code of Conduct is to make our community welcoming to
|
|
||||||
people from different backgrounds.
|
|
||||||
Diversity is critical to the project; for Go to be successful, it needs
|
|
||||||
contributors and users from all backgrounds.
|
|
||||||
(See <a href="https://blog.golang.org/open-source">Go, Open Source, Community</a>.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We believe that healthy debate and disagreement are essential to a healthy project and community.
|
|
||||||
However, it is never ok to be disrespectful.
|
|
||||||
We value diverse opinions, but we value respectful behavior more.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="values">Gopher values</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
These are the values to which people in the Go community (“Gophers”) should aspire.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Be friendly and welcoming
|
|
||||||
<li>Be patient
|
|
||||||
<ul>
|
|
||||||
<li>Remember that people have varying communication styles and that not
|
|
||||||
everyone is using their native language.
|
|
||||||
(Meaning and tone can be lost in translation.)
|
|
||||||
</ul>
|
|
||||||
<li>Be thoughtful
|
|
||||||
<ul>
|
|
||||||
<li>Productive communication requires effort.
|
|
||||||
Think about how your words will be interpreted.
|
|
||||||
<li>Remember that sometimes it is best to refrain entirely from commenting.
|
|
||||||
</ul>
|
|
||||||
<li>Be respectful
|
|
||||||
<ul>
|
|
||||||
<li>In particular, respect differences of opinion.
|
|
||||||
</ul>
|
|
||||||
<li>Be charitable
|
|
||||||
<ul>
|
|
||||||
<li>Interpret the arguments of others in good faith, do not seek to disagree.
|
|
||||||
<li>When we do disagree, try to understand why.
|
|
||||||
</ul>
|
|
||||||
<li>Avoid destructive behavior:
|
|
||||||
<ul>
|
|
||||||
<li>Derailing: stay on topic; if you want to talk about something else,
|
|
||||||
start a new conversation.
|
|
||||||
<li>Unconstructive criticism: don't merely decry the current state of affairs;
|
|
||||||
offer—or at least solicit—suggestions as to how things may be improved.
|
|
||||||
<li>Snarking (pithy, unproductive, sniping comments)
|
|
||||||
<li>Discussing potentially offensive or sensitive issues;
|
|
||||||
this all too often leads to unnecessary conflict.
|
|
||||||
<li>Microaggressions: brief and commonplace verbal, behavioral and
|
|
||||||
environmental indignities that communicate hostile, derogatory or negative
|
|
||||||
slights and insults to a person or group.
|
|
||||||
</ul>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
People are complicated.
|
|
||||||
You should expect to be misunderstood and to misunderstand others;
|
|
||||||
when this inevitably occurs, resist the urge to be defensive or assign blame.
|
|
||||||
Try not to take offense where no offense was intended.
|
|
||||||
Give people the benefit of the doubt.
|
|
||||||
Even if the intent was to provoke, do not rise to it.
|
|
||||||
It is the responsibility of <i>all parties</i> to de-escalate conflict when it arises.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="code">Code of Conduct</h2>
|
|
||||||
|
|
||||||
<h3 id="our-pledge">Our Pledge</h3>
|
|
||||||
|
|
||||||
<p>In the interest of fostering an open and welcoming environment, we as
|
|
||||||
contributors and maintainers pledge to making participation in our project and
|
|
||||||
our community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, disability, ethnicity, gender identity and expression, level of
|
|
||||||
experience, education, socio-economic status, nationality, personal appearance,
|
|
||||||
race, religion, or sexual identity and orientation.</p>
|
|
||||||
|
|
||||||
<h3 id="our-standards">Our Standards</h3>
|
|
||||||
|
|
||||||
<p>Examples of behavior that contributes to creating a positive environment
|
|
||||||
include:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Using welcoming and inclusive language</li>
|
|
||||||
<li>Being respectful of differing viewpoints and experiences</li>
|
|
||||||
<li>Gracefully accepting constructive criticism</li>
|
|
||||||
<li>Focusing on what is best for the community</li>
|
|
||||||
<li>Showing empathy towards other community members</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Examples of unacceptable behavior by participants include:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>The use of sexualized language or imagery and unwelcome sexual attention or
|
|
||||||
advances</li>
|
|
||||||
<li>Trolling, insulting/derogatory comments, and personal or political attacks</li>
|
|
||||||
<li>Public or private harassment</li>
|
|
||||||
<li>Publishing others’ private information, such as a physical or electronic
|
|
||||||
address, without explicit permission</li>
|
|
||||||
<li>Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="our-responsibilities">Our Responsibilities</h3>
|
|
||||||
|
|
||||||
<p>Project maintainers are responsible for clarifying the standards of acceptable
|
|
||||||
behavior and are expected to take appropriate and fair corrective action in
|
|
||||||
response to any instances of unacceptable behavior.</p>
|
|
||||||
|
|
||||||
<p>Project maintainers have the right and responsibility to remove, edit, or reject
|
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, or to ban temporarily or permanently any
|
|
||||||
contributor for other behaviors that they deem inappropriate, threatening,
|
|
||||||
offensive, or harmful.</p>
|
|
||||||
|
|
||||||
<h3 id="scope">Scope</h3>
|
|
||||||
|
|
||||||
<p>This Code of Conduct applies both within project spaces and in public spaces
|
|
||||||
when an individual is representing the project or its community. Examples of
|
|
||||||
representing a project or community include using an official project e-mail
|
|
||||||
address, posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event. Representation of a project may be
|
|
||||||
further defined and clarified by project maintainers.</p>
|
|
||||||
|
|
||||||
<p>This Code of Conduct also applies outside the project spaces when the Project
|
|
||||||
Steward has a reasonable belief that an individual’s behavior may have a
|
|
||||||
negative impact on the project or its community.</p>
|
|
||||||
|
|
||||||
<h3 id="conflict-resolution"></a>Conflict Resolution</h3>
|
|
||||||
|
|
||||||
<p>We do not believe that all conflict is bad; healthy debate and disagreement
|
|
||||||
often yield positive results. However, it is never okay to be disrespectful or
|
|
||||||
to engage in behavior that violates the project’s code of conduct.</p>
|
|
||||||
|
|
||||||
<p>If you see someone violating the code of conduct, you are encouraged to address
|
|
||||||
the behavior directly with those involved. Many issues can be resolved quickly
|
|
||||||
and easily, and this gives people more control over the outcome of their
|
|
||||||
dispute. If you are unable to resolve the matter for any reason, or if the
|
|
||||||
behavior is threatening or harassing, report it. We are dedicated to providing
|
|
||||||
an environment where participants feel welcome and safe.</p>
|
|
||||||
|
|
||||||
<p id="reporting">Reports should be directed to Cassandra Salisbury, the
|
|
||||||
Go Project Steward, at <i>conduct@golang.org</i>.
|
|
||||||
It is the Project Steward’s duty to
|
|
||||||
receive and address reported violations of the code of conduct. They will then
|
|
||||||
work with a committee consisting of representatives from the Open Source
|
|
||||||
Programs Office and the Google Open Source Strategy team. If for any reason you
|
|
||||||
are uncomfortable reaching out the Project Steward, please email
|
|
||||||
the Google Open Source Programs Office at <i>opensource@google.com</i>.</p>
|
|
||||||
|
|
||||||
<p>We will investigate every complaint, but you may not receive a direct response.
|
|
||||||
We will use our discretion in determining when and how to follow up on reported
|
|
||||||
incidents, which may range from not taking action to permanent expulsion from
|
|
||||||
the project and project-sponsored spaces. We will notify the accused of the
|
|
||||||
report and provide them an opportunity to discuss it before any action is taken.
|
|
||||||
The identity of the reporter will be omitted from the details of the report
|
|
||||||
supplied to the accused. In potentially harmful situations, such as ongoing
|
|
||||||
harassment or threats to anyone’s safety, we may take action without notice.</p>
|
|
||||||
|
|
||||||
<h3 id="attribution">Attribution</h3>
|
|
||||||
|
|
||||||
<p>This Code of Conduct is adapted from the Contributor Covenant, version 1.4,
|
|
||||||
available at
|
|
||||||
<a href="https://www.contributor-covenant.org/version/1/4/code-of-conduct.html">https://www.contributor-covenant.org/version/1/4/code-of-conduct.html</a></p>
|
|
||||||
|
|
||||||
<h2 id="summary">Summary</h2>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Treat everyone with respect and kindness.
|
|
||||||
<li>Be thoughtful in how you communicate.
|
|
||||||
<li>Don’t be destructive or inflammatory.
|
|
||||||
<li>If you encounter an issue, please mail <a href="mailto:conduct@golang.org">conduct@golang.org</a>.
|
|
||||||
</ul>
|
|
||||||
|
|
@ -34,6 +34,7 @@ We encourage all Go users to subscribe to
|
||||||
<p>A <a href="/doc/devel/release.html">summary</a> of the changes between Go releases. Notes for the major releases:</p>
|
<p>A <a href="/doc/devel/release.html">summary</a> of the changes between Go releases. Notes for the major releases:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
<li><a href="/doc/go1.14">Go 1.14</a> <small>(February 2020)</small></li>
|
||||||
<li><a href="/doc/go1.13">Go 1.13</a> <small>(September 2019)</small></li>
|
<li><a href="/doc/go1.13">Go 1.13</a> <small>(September 2019)</small></li>
|
||||||
<li><a href="/doc/go1.12">Go 1.12</a> <small>(February 2019)</small></li>
|
<li><a href="/doc/go1.12">Go 1.12</a> <small>(February 2019)</small></li>
|
||||||
<li><a href="/doc/go1.11">Go 1.11</a> <small>(August 2018)</small></li>
|
<li><a href="/doc/go1.11">Go 1.11</a> <small>(August 2018)</small></li>
|
||||||
|
|
|
||||||
|
|
@ -552,9 +552,7 @@ $ ./all.bash
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
(To build under Windows use <code>all.bat</code>; this also requires
|
(To build under Windows use <code>all.bat</code>)
|
||||||
setting the environment variable <code>GOROOT_BOOTSTRAP</code> to the
|
|
||||||
directory holding the Go tree for the bootstrap compiler.)
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -925,13 +923,13 @@ New files that you contribute should use the standard copyright header:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
// Copyright 2020 The Go Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
(Use the current year if you're reading this in 2020 or beyond.)
|
(Use the current year if you're reading this in 2021 or beyond.)
|
||||||
Files in the repository are copyrighted the year they are added.
|
Files in the repository are copyrighted the year they are added.
|
||||||
Do not update the copyright year on files that you change.
|
Do not update the copyright year on files that you change.
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -1008,7 +1006,7 @@ followed by <code>run.bash</code>.
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
In this section, we'll call the directory into which you cloned the Go repository <code>$GODIR</code>.
|
In this section, we'll call the directory into which you cloned the Go repository <code>$GODIR</code>.
|
||||||
The <code>go</code> tool built by <code>$GODIR/make.bash</code> will be installed
|
The <code>go</code> tool built by <code>$GODIR/src/make.bash</code> will be installed
|
||||||
in <code>$GODIR/bin/go</code> and you
|
in <code>$GODIR/bin/go</code> and you
|
||||||
can invoke it to test your code.
|
can invoke it to test your code.
|
||||||
For instance, if you
|
For instance, if you
|
||||||
|
|
|
||||||
|
|
@ -1,455 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Title": "Pre-Go 1 Release History"
|
|
||||||
}-->
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This page summarizes the changes between stable releases of Go prior to Go 1.
|
|
||||||
See the <a href="release.html">Release History</a> page for notes on recent releases.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="r60">r60 (released 2011/09/07)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The r60 release corresponds to
|
|
||||||
<code><a href="weekly.html#2011-08-17">weekly.2011-08-17</a></code>.
|
|
||||||
This section highlights the most significant changes in this release.
|
|
||||||
For a more detailed summary, see the
|
|
||||||
<a href="weekly.html#2011-08-17">weekly release notes</a>.
|
|
||||||
For complete information, see the
|
|
||||||
<a href="//code.google.com/p/go/source/list?r=release-branch.r60">Mercurial change list</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r60.lang">Language</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
An "else" block is now required to have braces except if the body of the "else"
|
|
||||||
is another "if". Since gofmt always puts those braces in anyway,
|
|
||||||
gofmt-formatted programs will not be affected.
|
|
||||||
To fix other programs, run gofmt.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r60.pkg">Packages</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/http/">Package http</a>'s URL parsing and query escaping code
|
|
||||||
(such as <code>ParseURL</code> and <code>URLEscape</code>) has been moved to
|
|
||||||
the new <a href="/pkg/url/">url package</a>, with several simplifications to
|
|
||||||
the names. Client code can be updated automatically with gofix.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/image/">Package image</a> has had significant changes made to the
|
|
||||||
<code>Pix</code> field of struct types such as
|
|
||||||
<a href="/pkg/image/#RGBA">image.RGBA</a> and
|
|
||||||
<a href="/pkg/image/#NRGBA">image.NRGBA</a>.
|
|
||||||
The <a href="/pkg/image/#Image">image.Image</a> interface type has not changed,
|
|
||||||
though, and you should not need to change your code if you don't explicitly
|
|
||||||
refer to <code>Pix</code> fields. For example, if you decode a number of images
|
|
||||||
using the <a href="/pkg/image/jpeg/">image/jpeg</a> package, compose them using
|
|
||||||
<a href="/pkg/image/draw/">image/draw</a>, and then encode the result using
|
|
||||||
<a href="/pkg/img/png">image/png</a>, then your code should still work as
|
|
||||||
before.
|
|
||||||
If your code <i>does</i> refer to <code>Pix</code> fields see the
|
|
||||||
<a href="/doc/devel/weekly.html#2011-07-19">weekly.2011-07-19</a>
|
|
||||||
snapshot notes for how to update your code.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/template/">Package template</a> has been replaced with a new
|
|
||||||
templating package (formerly <code>exp/template</code>). The original template
|
|
||||||
package is still available as <a href="/pkg/old/template/">old/template</a>.
|
|
||||||
The <code>old/template</code> package is deprecated and will be removed.
|
|
||||||
The Go tree has been updated to use the new template package. We encourage
|
|
||||||
users of the old template package to switch to the new one. Code that uses
|
|
||||||
<code>template</code> or <code>exp/template</code> will need to change its
|
|
||||||
import lines to <code>"old/template"</code> or <code>"template"</code>,
|
|
||||||
respectively.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r60.cmd">Tools</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/cmd/goinstall/">Goinstall</a> now uses a new tag selection scheme.
|
|
||||||
When downloading or updating, goinstall looks for a tag or branch with the
|
|
||||||
<code>"go."</code> prefix that corresponds to the local Go version. For Go
|
|
||||||
<code>release.r58</code> it looks for <code>go.r58</code>. For
|
|
||||||
<code>weekly.2011-06-03</code> it looks for <code>go.weekly.2011-06-03</code>.
|
|
||||||
If the specific <code>go.X</code> tag or branch is not found, it chooses the
|
|
||||||
closest earlier version. If an appropriate tag or branch is found, goinstall
|
|
||||||
uses that version of the code. Otherwise it uses the default version selected
|
|
||||||
by the version control system. Library authors are encouraged to use the
|
|
||||||
appropriate tag or branch names in their repositories to make their libraries
|
|
||||||
more accessible.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r60.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
r60.1 includes a
|
|
||||||
<a href="//golang.org/change/1824581bf62d">linker
|
|
||||||
fix</a>, a pair of
|
|
||||||
<a href="//golang.org/change/9ef4429c2c64">goplay</a>
|
|
||||||
<a href="//golang.org/change/d42ed8c3098e">fixes</a>,
|
|
||||||
and a <code>json</code> package
|
|
||||||
<a href="//golang.org/change/d5e97874fe84">fix</a> and
|
|
||||||
a new
|
|
||||||
<a href="//golang.org/change/4f0e6269213f">struct tag
|
|
||||||
option</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
r60.2
|
|
||||||
<a href="//golang.org/change/ff19536042ac">fixes</a>
|
|
||||||
a memory leak involving maps.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
r60.3 fixes a
|
|
||||||
<a href="//golang.org/change/01fa62f5e4e5">reflect bug</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="r59">r59 (released 2011/08/01)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The r59 release corresponds to
|
|
||||||
<code><a href="weekly.html#2011-07-07">weekly.2011-07-07</a></code>.
|
|
||||||
This section highlights the most significant changes in this release.
|
|
||||||
For a more detailed summary, see the
|
|
||||||
<a href="weekly.html#2011-07-07">weekly release notes</a>.
|
|
||||||
For complete information, see the
|
|
||||||
<a href="//code.google.com/p/go/source/list?r=release-branch.r59">Mercurial change list</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r59.lang">Language</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This release includes a language change that restricts the use of
|
|
||||||
<code>goto</code>. In essence, a <code>goto</code> statement outside a block
|
|
||||||
cannot jump to a label inside that block. Your code may require changes if it
|
|
||||||
uses <code>goto</code>.
|
|
||||||
See <a href="//golang.org/change/dc6d3cf9279d">this
|
|
||||||
changeset</a> for how the new rule affected the Go tree.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r59.pkg">Packages</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
As usual, <a href="/cmd/gofix/">gofix</a> will handle the bulk of the rewrites
|
|
||||||
necessary for these changes to package APIs.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/http">Package http</a> has a new
|
|
||||||
<a href="/pkg/http/#FileSystem">FileSystem</a> interface that provides access
|
|
||||||
to files. The <a href="/pkg/http/#FileServer">FileServer</a> helper now takes a
|
|
||||||
<code>FileSystem</code> argument instead of an explicit file system root. By
|
|
||||||
implementing your own <code>FileSystem</code> you can use the
|
|
||||||
<code>FileServer</code> to serve arbitrary data.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/os/">Package os</a>'s <code>ErrorString</code> type has been
|
|
||||||
hidden. Most uses of <code>os.ErrorString</code> can be replaced with
|
|
||||||
<a href="/pkg/os/#NewError">os.NewError</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/reflect/">Package reflect</a> supports a new struct tag scheme
|
|
||||||
that enables sharing of struct tags between multiple packages.
|
|
||||||
In this scheme, the tags must be of the form:
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
`key:"value" key2:"value2"`
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
The <a href="/pkg/reflect/#StructField">StructField</a> type's Tag field now
|
|
||||||
has type <a href="/pkg/reflect/#StructTag">StructTag</a>, which has a
|
|
||||||
<code>Get</code> method. Clients of <a href="/pkg/json">json</a> and
|
|
||||||
<a href="/pkg/xml">xml</a> will need to be updated. Code that says
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
type T struct {
|
|
||||||
X int "name"
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
should become
|
|
||||||
</p>
|
|
||||||
<pre>
|
|
||||||
type T struct {
|
|
||||||
X int `json:"name"` // or `xml:"name"`
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
Use <a href="/cmd/govet/">govet</a> to identify struct tags that need to be
|
|
||||||
changed to use the new syntax.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/sort/">Package sort</a>'s <code>IntArray</code> type has been
|
|
||||||
renamed to <a href="/pkg/sort/#IntSlice">IntSlice</a>, and similarly for
|
|
||||||
<a href="/pkg/sort/#Float64Slice">Float64Slice</a> and
|
|
||||||
<a href="/pkg/sort/#StringSlice">StringSlice</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/strings/">Package strings</a>'s <code>Split</code> function has
|
|
||||||
itself been split into <a href="/pkg/strings/#Split">Split</a> and
|
|
||||||
<a href="/pkg/strings/#SplitN">SplitN</a>.
|
|
||||||
<code>SplitN</code> is the same as the old <code>Split</code>.
|
|
||||||
The new <code>Split</code> is equivalent to <code>SplitN</code> with a final
|
|
||||||
argument of -1.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<a href="/pkg/image/draw/">Package image/draw</a>'s
|
|
||||||
<a href="/pkg/image/draw/#Draw">Draw</a> function now takes an additional
|
|
||||||
argument, a compositing operator.
|
|
||||||
If in doubt, use <a href="/pkg/image/draw/#Op">draw.Over</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r59.cmd">Tools</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/cmd/goinstall/">Goinstall</a> now installs packages and commands from
|
|
||||||
arbitrary remote repositories (not just Google Code, Github, and so on).
|
|
||||||
See the <a href="/cmd/goinstall/">goinstall documentation</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="r58">r58 (released 2011/06/29)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The r58 release corresponds to
|
|
||||||
<code><a href="weekly.html#2011-06-09">weekly.2011-06-09</a></code>
|
|
||||||
with additional bug fixes.
|
|
||||||
This section highlights the most significant changes in this release.
|
|
||||||
For a more detailed summary, see the
|
|
||||||
<a href="weekly.html#2011-06-09">weekly release notes</a>.
|
|
||||||
For complete information, see the
|
|
||||||
<a href="//code.google.com/p/go/source/list?r=release-branch.r58">Mercurial change list</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r58.lang">Language</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This release fixes a <a href="//golang.org/change/b720749486e1">use of uninitialized memory in programs that misuse <code>goto</code></a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r58.pkg">Packages</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
As usual, <a href="/cmd/gofix/">gofix</a> will handle the bulk of the rewrites
|
|
||||||
necessary for these changes to package APIs.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/http/">Package http</a> drops the <code>finalURL</code> return
|
|
||||||
value from the <a href="/pkg/http/#Client.Get">Client.Get</a> method. The value
|
|
||||||
is now available via the new <code>Request</code> field on <a
|
|
||||||
href="/pkg/http/#Response">http.Response</a>.
|
|
||||||
Most instances of the type map[string][]string in have been
|
|
||||||
replaced with the new <a href="/pkg/http/#Values">Values</a> type.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/exec/">Package exec</a> has been redesigned with a more
|
|
||||||
convenient and succinct API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/strconv/">Package strconv</a>'s <a href="/pkg/strconv/#Quote">Quote</a>
|
|
||||||
function now escapes only those Unicode code points not classified as printable
|
|
||||||
by <a href="/pkg/unicode/#IsPrint">unicode.IsPrint</a>.
|
|
||||||
Previously Quote would escape all non-ASCII characters.
|
|
||||||
This also affects the <a href="/pkg/fmt/">fmt</a> package's <code>"%q"</code>
|
|
||||||
formatting directive. The previous quoting behavior is still available via
|
|
||||||
strconv's new <a href="/pkg/strconv/#QuoteToASCII">QuoteToASCII</a> function.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/os/signal/">Package os/signal</a>'s
|
|
||||||
<a href="/pkg/os/#Signal">Signal</a> and
|
|
||||||
<a href="/pkg/os/#UnixSignal">UnixSignal</a> types have been moved to the
|
|
||||||
<a href="/pkg/os/">os</a> package.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/image/draw/">Package image/draw</a> is the new name for
|
|
||||||
<code>exp/draw</code>. The GUI-related code from <code>exp/draw</code> is now
|
|
||||||
located in the <a href="/pkg/exp/gui/">exp/gui</a> package.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r58.cmd">Tools</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/cmd/goinstall/">Goinstall</a> now observes the GOPATH environment
|
|
||||||
variable to build and install your own code and external libraries outside of
|
|
||||||
the Go tree (and avoid writing Makefiles).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h3 id="r58.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>r58.1 adds
|
|
||||||
<a href="//golang.org/change/293c25943586">build</a> and
|
|
||||||
<a href="//golang.org/change/bf17e96b6582">runtime</a>
|
|
||||||
changes to make Go run on OS X 10.7 Lion.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="r57">r57 (released 2011/05/03)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The r57 release corresponds to
|
|
||||||
<code><a href="weekly.html#2011-04-27">weekly.2011-04-27</a></code>
|
|
||||||
with additional bug fixes.
|
|
||||||
This section highlights the most significant changes in this release.
|
|
||||||
For a more detailed summary, see the
|
|
||||||
<a href="weekly.html#2011-04-27">weekly release notes</a>.
|
|
||||||
For complete information, see the
|
|
||||||
<a href="//code.google.com/p/go/source/list?r=release-branch.r57">Mercurial change list</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>The new <a href="/cmd/gofix">gofix</a> tool finds Go programs that use old APIs and rewrites them to use
|
|
||||||
newer ones. After you update to a new Go release, gofix helps make the
|
|
||||||
necessary changes to your programs. Gofix will handle the http, os, and syscall
|
|
||||||
package changes described below, and we will update the program to keep up with
|
|
||||||
future changes to the libraries.
|
|
||||||
Gofix can’t
|
|
||||||
handle all situations perfectly, so read and test the changes it makes before
|
|
||||||
committing them.
|
|
||||||
See <a href="//blog.golang.org/2011/04/introducing-gofix.html">the gofix blog post</a> for more
|
|
||||||
information.</p>
|
|
||||||
|
|
||||||
<h3 id="r57.lang">Language</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/doc/go_spec.html#Receive_operator">Multiple assignment syntax</a> replaces the <code>closed</code> function.
|
|
||||||
The syntax for channel
|
|
||||||
receives allows an optional second assigned value, a boolean value
|
|
||||||
indicating whether the channel is closed. This code:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
v := <-ch
|
|
||||||
if closed(ch) {
|
|
||||||
// channel is closed
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>should now be written as:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
v, ok := <-ch
|
|
||||||
if !ok {
|
|
||||||
// channel is closed
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p><a href="/doc/go_spec.html#Label_scopes">Unused labels are now illegal</a>, just as unused local variables are.</p>
|
|
||||||
|
|
||||||
<h3 id="r57.pkg">Packages</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/gob/">Package gob</a> will now encode and decode values of types that implement the
|
|
||||||
<a href="/pkg/gob/#GobEncoder">GobEncoder</a> and
|
|
||||||
<a href="/pkg/gob/#GobDecoder">GobDecoder</a> interfaces. This allows types with unexported
|
|
||||||
fields to transmit self-consistent descriptions; examples include
|
|
||||||
<a href="/pkg/big/#Int.GobDecode">big.Int</a> and <a href="/pkg/big/#Rat.GobDecode">big.Rat</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/http/">Package http</a> has been redesigned.
|
|
||||||
For clients, there are new
|
|
||||||
<a href="/pkg/http/#Client">Client</a> and <a href="/pkg/http/#Transport">Transport</a>
|
|
||||||
abstractions that give more control over HTTP details such as headers sent
|
|
||||||
and redirections followed. These abstractions make it easy to implement
|
|
||||||
custom clients that add functionality such as <a href="//code.google.com/p/goauth2/source/browse/oauth/oauth.go">OAuth2</a>.
|
|
||||||
For servers, <a href="/pkg/http/#ResponseWriter">ResponseWriter</a>
|
|
||||||
has dropped its non-essential methods.
|
|
||||||
The Hijack and Flush methods are no longer required;
|
|
||||||
code can test for them by checking whether a specific value implements
|
|
||||||
<a href="/pkg/http/#Hijacker">Hijacker</a> or <a href="/pkg/http/#Flusher">Flusher</a>.
|
|
||||||
The RemoteAddr and UsingTLS methods are replaced by <a href="/pkg/http/#Request">Request</a>'s
|
|
||||||
RemoteAddr and TLS fields.
|
|
||||||
The SetHeader method is replaced by a Header method;
|
|
||||||
its result, of type <a href="/pkg/http/#Header">Header</a>,
|
|
||||||
implements Set and other methods.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/net/">Package net</a>
|
|
||||||
drops the <code>laddr</code> argument from <a href="/pkg/net/#Conn.Dial">Dial</a>
|
|
||||||
and drops the <code>cname</code> return value
|
|
||||||
from <a href="/pkg/net/#LookupHost">LookupHost</a>.
|
|
||||||
The implementation now uses <a href="/cmd/cgo/">cgo</a> to implement
|
|
||||||
network name lookups using the C library getaddrinfo(3)
|
|
||||||
function when possible. This ensures that Go and C programs
|
|
||||||
resolve names the same way and also avoids the OS X
|
|
||||||
application-level firewall.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/os/">Package os</a>
|
|
||||||
introduces simplified <a href="/pkg/os/#File.Open">Open</a>
|
|
||||||
and <a href="/pkg/os/#File.Create">Create</a> functions.
|
|
||||||
The original Open is now available as <a href="/pkg/os/#File.OpenFile">OpenFile</a>.
|
|
||||||
The final three arguments to <a href="/pkg/os/#Process.StartProcess">StartProcess</a>
|
|
||||||
have been replaced by a pointer to a <a href="/pkg/os/#ProcAttr">ProcAttr</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/pkg/reflect/">Package reflect</a> has been redesigned.
|
|
||||||
<a href="/pkg/reflect/#Type">Type</a> is now an interface that implements
|
|
||||||
all the possible type methods.
|
|
||||||
Instead of a type switch on a Type <code>t</code>, switch on <code>t.Kind()</code>.
|
|
||||||
<a href="/pkg/reflect/#Value">Value</a> is now a struct value that
|
|
||||||
implements all the possible value methods.
|
|
||||||
Instead of a type switch on a Value <code>v</code>, switch on <code>v.Kind()</code>.
|
|
||||||
Typeof and NewValue are now called <a href="/pkg/reflect/#Type.TypeOf">TypeOf</a> and <a href="/pkg/reflect/#Value.ValueOf">ValueOf</a>
|
|
||||||
To create a writable Value, use <code>New(t).Elem()</code> instead of <code>Zero(t)</code>.
|
|
||||||
See <a href="//golang.org/change/843855f3c026">the change description</a>
|
|
||||||
for the full details.
|
|
||||||
The new API allows a more efficient implementation of Value
|
|
||||||
that avoids many of the allocations required by the previous API.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Remember that gofix will handle the bulk of the rewrites
|
|
||||||
necessary for these changes to package APIs.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r57.cmd">Tools</h3>
|
|
||||||
|
|
||||||
<p><a href="/cmd/gofix/">Gofix</a>, a new command, is described above.</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/cmd/gotest/">Gotest</a> is now a Go program instead of a shell script.
|
|
||||||
The new <code>-test.short</code> flag in combination with package testing's Short function
|
|
||||||
allows you to write tests that can be run in normal or “short” mode;
|
|
||||||
all.bash runs tests in short mode to reduce installation time.
|
|
||||||
The Makefiles know about the flag: use <code>make testshort</code>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The run-time support now implements CPU and memory profiling.
|
|
||||||
Gotest's new
|
|
||||||
<a href="/cmd/gotest/"><code>-test.cpuprofile</code> and
|
|
||||||
<code>-test.memprofile</code> flags</a> make it easy to
|
|
||||||
profile tests.
|
|
||||||
To add profiling to your web server, see the <a href="/pkg/http/pprof/">http/pprof</a>
|
|
||||||
documentation.
|
|
||||||
For other uses, see the <a href="/pkg/runtime/pprof/">runtime/pprof</a> documentation.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="r57.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>r57.1 fixes a <a href="//golang.org/change/ff2bc62726e7145eb2ecc1e0f076998e4a8f86f0">nil pointer dereference in http.FormFile</a>.</p>
|
|
||||||
<p>r57.2 fixes a <a href="//golang.org/change/063b0ff67d8277df03c956208abc068076818dae">use of uninitialized memory in programs that misuse <code>goto</code></a>.</p>
|
|
||||||
|
|
||||||
<h2 id="r56">r56 (released 2011/03/16)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The r56 release was the first stable release and corresponds to
|
|
||||||
<code><a href="weekly.html#2011-03-07">weekly.2011-03-07.1</a></code>.
|
|
||||||
The numbering starts at 56 because before this release,
|
|
||||||
what we now consider weekly snapshots were called releases.
|
|
||||||
</p>
|
|
||||||
|
|
@ -1,745 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Title": "Release History"
|
|
||||||
}-->
|
|
||||||
|
|
||||||
<p>This page summarizes the changes between official stable releases of Go.
|
|
||||||
The <a href="//golang.org/change">change log</a> has the full details.</p>
|
|
||||||
|
|
||||||
<p>To update to a specific release, use:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
git pull
|
|
||||||
git checkout <i>release-branch</i>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h2 id="policy">Release Policy</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Each major Go release is supported until there are two newer major releases.
|
|
||||||
For example, Go 1.5 was supported until the Go 1.7 release, and Go 1.6 was
|
|
||||||
supported until the Go 1.8 release.
|
|
||||||
We fix critical problems, including <a href="/security">critical security problems</a>,
|
|
||||||
in supported releases as needed by issuing minor revisions
|
|
||||||
(for example, Go 1.6.1, Go 1.6.2, and so on).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.13">go1.13 (released 2019/09/03)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.13 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.13">Go 1.13 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.13.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.13.1 (released 2019/09/25) includes security fixes to the
|
|
||||||
<code>net/http</code> and <code>net/textproto</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.13.1">Go
|
|
||||||
1.13.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.13.2 (released 2019/10/17) includes security fixes to the
|
|
||||||
<code>crypto/dsa</code> package and the compiler.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.13.2">Go
|
|
||||||
1.13.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.13.3 (released 2019/10/17) includes fixes to the go command,
|
|
||||||
the toolchain, the runtime, <code>syscall</code>, <code>net</code>,
|
|
||||||
<code>net/http</code>, and <code>crypto/ecdsa</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.13.3">Go
|
|
||||||
1.13.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.13.4 (released 2019/10/31) includes fixes to the <code>net/http</code> and
|
|
||||||
<code>syscall</code> packages. It also fixes an issue on macOS 10.15 Catalina
|
|
||||||
where the non-notarized installer and binaries were being
|
|
||||||
<a href="https://golang.org/issue/34986">rejected by Gatekeeper</a>.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.13.4">Go
|
|
||||||
1.13.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.12">go1.12 (released 2019/02/25)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.12 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.12">Go 1.12 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.12.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.1 (released 2019/03/14) includes fixes to cgo, the compiler, the go
|
|
||||||
command, and the <code>fmt</code>, <code>net/smtp</code>, <code>os</code>,
|
|
||||||
<code>path/filepath</code>, <code>sync</code>, and <code>text/template</code>
|
|
||||||
packages. See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.1">Go
|
|
||||||
1.12.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.2 (released 2019/04/05) includes fixes to the compiler, the go
|
|
||||||
command, the runtime, and the <code>doc</code>, <code>net</code>,
|
|
||||||
<code>net/http/httputil</code>, and <code>os</code> packages. See the
|
|
||||||
<a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.2">Go
|
|
||||||
1.12.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.3 (released 2019/04/08) was accidentally released without its
|
|
||||||
intended fix. It is identical to go1.12.2, except for its version
|
|
||||||
number. The intended fix is in go1.12.4.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.4 (released 2019/04/11) fixes an issue where using the prebuilt binary
|
|
||||||
releases on older versions of GNU/Linux
|
|
||||||
<a href="https://golang.org/issues/31293">led to failures</a>
|
|
||||||
when linking programs that used cgo.
|
|
||||||
Only Linux users who hit this issue need to update.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.5 (released 2019/05/06) includes fixes to the compiler, the linker,
|
|
||||||
the go command, the runtime, and the <code>os</code> package. See the
|
|
||||||
<a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.5">Go
|
|
||||||
1.12.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.6 (released 2019/06/11) includes fixes to the compiler, the linker,
|
|
||||||
the go command, and the <code>crypto/x509</code>, <code>net/http</code>, and
|
|
||||||
<code>os</code> packages. See the
|
|
||||||
<a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.6">Go
|
|
||||||
1.12.6 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.7 (released 2019/07/08) includes fixes to cgo, the compiler,
|
|
||||||
and the linker.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.7">Go
|
|
||||||
1.12.7 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.8 (released 2019/08/13) includes security fixes to the
|
|
||||||
<code>net/http</code> and <code>net/url</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.8">Go
|
|
||||||
1.12.8 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.9 (released 2019/08/15) includes fixes to the linker,
|
|
||||||
and the <code>os</code> and <code>math/big</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.9+label%3ACherryPickApproved">Go
|
|
||||||
1.12.9 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.10 (released 2019/09/25) includes security fixes to the
|
|
||||||
<code>net/http</code> and <code>net/textproto</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.10">Go
|
|
||||||
1.12.10 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.11 (released 2019/10/17) includes security fixes to the
|
|
||||||
<code>crypto/dsa</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.11">Go
|
|
||||||
1.12.11 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.12 (released 2019/10/17) includes fixes to the go command,
|
|
||||||
runtime, <code>syscall</code> and <code>net</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.12.12">Go
|
|
||||||
1.12.12 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.12.13 (released 2019/10/31) fixes an issue on macOS 10.15 Catalina
|
|
||||||
where the non-notarized installer and binaries were being
|
|
||||||
<a href="https://golang.org/issue/34986">rejected by Gatekeeper</a>.
|
|
||||||
Only macOS users who hit this issue need to update.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.11">go1.11 (released 2018/08/24)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.11 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.11">Go 1.11 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.11.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.1 (released 2018/10/01) includes fixes to the compiler, documentation, go
|
|
||||||
command, runtime, and the <code>crypto/x509</code>, <code>encoding/json</code>,
|
|
||||||
<code>go/types</code>, <code>net</code>, <code>net/http</code>, and
|
|
||||||
<code>reflect</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.1">Go
|
|
||||||
1.11.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.2 (released 2018/11/02) includes fixes to the compiler, linker,
|
|
||||||
documentation, go command, and the <code>database/sql</code> and
|
|
||||||
<code>go/types</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.2">Go
|
|
||||||
1.11.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.3 (released 2018/12/12) includes three security fixes to "go get" and
|
|
||||||
the <code>crypto/x509</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.3">Go
|
|
||||||
1.11.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.4 (released 2018/12/14) includes fixes to cgo, the compiler, linker,
|
|
||||||
runtime, documentation, go command, and the <code>net/http</code> and
|
|
||||||
<code>go/types</code> packages.
|
|
||||||
It includes a fix to a bug introduced in Go 1.11.3 that broke <code>go</code>
|
|
||||||
<code>get</code> for import path patterns containing "<code>...</code>".
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.4+label%3ACherryPickApproved">Go
|
|
||||||
1.11.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.5 (released 2019/01/23) includes a security fix to the
|
|
||||||
<code>crypto/elliptic</code> package. See
|
|
||||||
the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.5">Go
|
|
||||||
1.11.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.6 (released 2019/03/14) includes fixes to cgo, the compiler, linker,
|
|
||||||
runtime, go command, and the <code>crypto/x509</code>, <code>encoding/json</code>,
|
|
||||||
<code>net</code>, and <code>net/url</code> packages. See the
|
|
||||||
<a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.6">Go
|
|
||||||
1.11.6 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.7 (released 2019/04/05) includes fixes to the runtime and the
|
|
||||||
<code>net</code> packages. See the
|
|
||||||
<a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.7">Go
|
|
||||||
1.11.7 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.8 (released 2019/04/08) was accidentally released without its
|
|
||||||
intended fix. It is identical to go1.11.7, except for its version
|
|
||||||
number. The intended fix is in go1.11.9.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.9 (released 2019/04/11) fixes an issue where using the prebuilt binary
|
|
||||||
releases on older versions of GNU/Linux
|
|
||||||
<a href="https://golang.org/issues/31293">led to failures</a>
|
|
||||||
when linking programs that used cgo.
|
|
||||||
Only Linux users who hit this issue need to update.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.10 (released 2019/05/06) includes fixes to the runtime and the linker.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.10">Go
|
|
||||||
1.11.10 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.11 (released 2019/06/11) includes a fix to the <code>crypto/x509</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.11">Go
|
|
||||||
1.11.11 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.12 (released 2019/07/08) includes fixes to the compiler and the linker.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.12">Go
|
|
||||||
1.11.12 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.11.13 (released 2019/08/13) includes security fixes to the
|
|
||||||
<code>net/http</code> and <code>net/url</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.11.13">Go
|
|
||||||
1.11.13 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.10">go1.10 (released 2018/02/16)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.10 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.10">Go 1.10 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.10.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.1 (released 2018/03/28) includes fixes to the compiler, runtime, and the
|
|
||||||
<code>archive/zip</code>, <code>crypto/tls</code>, <code>crypto/x509</code>,
|
|
||||||
<code>encoding/json</code>, <code>net</code>, <code>net/http</code>, and
|
|
||||||
<code>net/http/pprof</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.1">Go
|
|
||||||
1.10.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.2 (released 2018/05/01) includes fixes to the compiler, linker, and go
|
|
||||||
command.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.2">Go
|
|
||||||
1.10.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.3 (released 2018/06/05) includes fixes to the go command, and the
|
|
||||||
<code>crypto/tls</code>, <code>crypto/x509</code>, and <code>strings</code> packages.
|
|
||||||
In particular, it adds <a href="https://go.googlesource.com/go/+/d4e21288e444d3ffd30d1a0737f15ea3fc3b8ad9">
|
|
||||||
minimal support to the go command for the vgo transition</a>.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.3">Go
|
|
||||||
1.10.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.4 (released 2018/08/24) includes fixes to the go command, linker, and the
|
|
||||||
<code>net/http</code>, <code>mime/multipart</code>, <code>ld/macho</code>,
|
|
||||||
<code>bytes</code>, and <code>strings</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.4">Go
|
|
||||||
1.10.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.5 (released 2018/11/02) includes fixes to the go command, linker, runtime
|
|
||||||
and the <code>database/sql</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.5">Go
|
|
||||||
1.10.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.6 (released 2018/12/12) includes three security fixes to "go get" and
|
|
||||||
the <code>crypto/x509</code> package.
|
|
||||||
It contains the same fixes as Go 1.11.3 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.6">Go
|
|
||||||
1.10.6 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.7 (released 2018/12/14) includes a fix to a bug introduced in Go 1.10.6
|
|
||||||
that broke <code>go</code> <code>get</code> for import path patterns containing
|
|
||||||
"<code>...</code>".
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.7+label%3ACherryPickApproved">
|
|
||||||
Go 1.10.7 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.10.8 (released 2019/01/23) includes a security fix to the
|
|
||||||
<code>crypto/elliptic</code> package. See
|
|
||||||
the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.10.8">Go
|
|
||||||
1.10.8 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.9">go1.9 (released 2017/08/24)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.9 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.9">Go 1.9 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.9.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.1 (released 2017/10/04) includes two security fixes.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.1">Go
|
|
||||||
1.9.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.2 (released 2017/10/25) includes fixes to the compiler, linker, runtime,
|
|
||||||
documentation, <code>go</code> command,
|
|
||||||
and the <code>crypto/x509</code>, <code>database/sql</code>, <code>log</code>,
|
|
||||||
and <code>net/smtp</code> packages.
|
|
||||||
It includes a fix to a bug introduced in Go 1.9.1 that broke <code>go</code> <code>get</code>
|
|
||||||
of non-Git repositories under certain conditions.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.2">Go
|
|
||||||
1.9.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.3 (released 2018/01/22) includes fixes to the compiler, runtime,
|
|
||||||
and the <code>database/sql</code>, <code>math/big</code>, <code>net/http</code>,
|
|
||||||
and <code>net/url</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.3">Go
|
|
||||||
1.9.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.4 (released 2018/02/07) includes a security fix to “go get”.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.4">Go
|
|
||||||
1.9.4</a> milestone on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.5 (released 2018/03/28) includes fixes to the compiler, go command, and
|
|
||||||
<code>net/http/pprof</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.5">Go
|
|
||||||
1.9.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.6 (released 2018/05/01) includes fixes to the compiler and go command.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.6">Go
|
|
||||||
1.9.6 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.9.7 (released 2018/06/05) includes fixes to the go command, and the
|
|
||||||
<code>crypto/x509</code>, and <code>strings</code> packages.
|
|
||||||
In particular, it adds <a href="https://go.googlesource.com/go/+/d4e21288e444d3ffd30d1a0737f15ea3fc3b8ad9">
|
|
||||||
minimal support to the go command for the vgo transition</a>.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.9.7">Go
|
|
||||||
1.9.7 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2 id="go1.8">go1.8 (released 2017/02/16)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.8 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.8">Go 1.8 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.8.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.1 (released 2017/04/07) includes fixes to the compiler, linker, runtime,
|
|
||||||
documentation, <code>go</code> command and the <code>crypto/tls</code>,
|
|
||||||
<code>encoding/xml</code>, <code>image/png</code>, <code>net</code>,
|
|
||||||
<code>net/http</code>, <code>reflect</code>, <code>text/template</code>,
|
|
||||||
and <code>time</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.1">Go
|
|
||||||
1.8.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.2 (released 2017/05/23) includes a security fix to the
|
|
||||||
<code>crypto/elliptic</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.2">Go
|
|
||||||
1.8.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.3 (released 2017/05/24) includes fixes to the compiler, runtime,
|
|
||||||
documentation, and the <code>database/sql</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.3">Go
|
|
||||||
1.8.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.4 (released 2017/10/04) includes two security fixes.
|
|
||||||
It contains the same fixes as Go 1.9.1 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.4">Go
|
|
||||||
1.8.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.5 (released 2017/10/25) includes fixes to the compiler, linker, runtime,
|
|
||||||
documentation, <code>go</code> command,
|
|
||||||
and the <code>crypto/x509</code> and <code>net/smtp</code> packages.
|
|
||||||
It includes a fix to a bug introduced in Go 1.8.4 that broke <code>go</code> <code>get</code>
|
|
||||||
of non-Git repositories under certain conditions.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.5">Go
|
|
||||||
1.8.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.6 (released 2018/01/22) includes the same fix in <code>math/big</code>
|
|
||||||
as Go 1.9.3 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.6">Go
|
|
||||||
1.8.6 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.8.7 (released 2018/02/07) includes a security fix to “go get”.
|
|
||||||
It contains the same fix as Go 1.9.4 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.7">Go
|
|
||||||
1.8.7</a> milestone on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.7">go1.7 (released 2016/08/15)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.7 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.7">Go 1.7 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.7.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.1 (released 2016/09/07) includes fixes to the compiler, runtime,
|
|
||||||
documentation, and the <code>compress/flate</code>, <code>hash/crc32</code>,
|
|
||||||
<code>io</code>, <code>net</code>, <code>net/http</code>,
|
|
||||||
<code>path/filepath</code>, <code>reflect</code>, and <code>syscall</code>
|
|
||||||
packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.7.1">Go
|
|
||||||
1.7.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.2 should not be used. It was tagged but not fully released.
|
|
||||||
The release was deferred due to a last minute bug report.
|
|
||||||
Use go1.7.3 instead, and refer to the summary of changes below.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.3 (released 2016/10/19) includes fixes to the compiler, runtime,
|
|
||||||
and the <code>crypto/cipher</code>, <code>crypto/tls</code>,
|
|
||||||
<code>net/http</code>, and <code>strings</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.7.3">Go
|
|
||||||
1.7.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.4 (released 2016/12/01) includes two security fixes.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.7.4">Go
|
|
||||||
1.7.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.5 (released 2017/01/26) includes fixes to the compiler, runtime,
|
|
||||||
and the <code>crypto/x509</code> and <code>time</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.7.5">Go
|
|
||||||
1.7.5 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.7.6 (released 2017/05/23) includes the same security fix as Go 1.8.2 and
|
|
||||||
was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.8.2">Go
|
|
||||||
1.8.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.6">go1.6 (released 2016/02/17)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.6 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.6">Go 1.6 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.6.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.6.1 (released 2016/04/12) includes two security fixes.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.1">Go
|
|
||||||
1.6.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.6.2 (released 2016/04/20) includes fixes to the compiler, runtime, tools,
|
|
||||||
documentation, and the <code>mime/multipart</code>, <code>net/http</code>, and
|
|
||||||
<code>sort</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.2">Go
|
|
||||||
1.6.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.6.3 (released 2016/07/17) includes security fixes to the
|
|
||||||
<code>net/http/cgi</code> package and <code>net/http</code> package when used in
|
|
||||||
a CGI environment.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.3">Go
|
|
||||||
1.6.3 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.6.4 (released 2016/12/01) includes two security fixes.
|
|
||||||
It contains the same fixes as Go 1.7.4 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.7.4">Go
|
|
||||||
1.7.4 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.5">go1.5 (released 2015/08/19)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.5 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.5">Go 1.5 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.5.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.5.1 (released 2015/09/08) includes bug fixes to the compiler, assembler, and
|
|
||||||
the <code>fmt</code>, <code>net/textproto</code>, <code>net/http</code>, and
|
|
||||||
<code>runtime</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.5.1">Go
|
|
||||||
1.5.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.5.2 (released 2015/12/02) includes bug fixes to the compiler, linker, and
|
|
||||||
the <code>mime/multipart</code>, <code>net</code>, and <code>runtime</code>
|
|
||||||
packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.5.2">Go
|
|
||||||
1.5.2 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.5.3 (released 2016/01/13) includes a security fix to the <code>math/big</code> package
|
|
||||||
affecting the <code>crypto/tls</code> package.
|
|
||||||
See the <a href="https://golang.org/s/go153announce">release announcement</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.5.4 (released 2016/04/12) includes two security fixes.
|
|
||||||
It contains the same fixes as Go 1.6.1 and was released at the same time.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.1">Go
|
|
||||||
1.6.1 milestone</a> on our issue tracker for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.4">go1.4 (released 2014/12/10)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.4 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.4">Go 1.4 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.4.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.4.1 (released 2015/01/15) includes bug fixes to the linker and the <code>log</code>, <code>syscall</code>, and <code>runtime</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.4.1">Go 1.4.1 milestone on our issue tracker</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.4.2 (released 2015/02/17) includes bug fixes to the <code>go</code> command, the compiler and linker, and the <code>runtime</code>, <code>syscall</code>, <code>reflect</code>, and <code>math/big</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.4.2">Go 1.4.2 milestone on our issue tracker</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.4.3 (released 2015/09/22) includes security fixes to the <code>net/http</code> package and bug fixes to the <code>runtime</code> package.
|
|
||||||
See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.4.3">Go 1.4.3 milestone on our issue tracker</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.3">go1.3 (released 2014/06/18)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.3 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.3">Go 1.3 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.3.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.3.1 (released 2014/08/13) includes bug fixes to the compiler and the <code>runtime</code>, <code>net</code>, and <code>crypto/rsa</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.3.1">change history</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.3.2 (released 2014/09/25) includes bug fixes to cgo and the crypto/tls packages.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.3.2">change history</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.3.3 (released 2014/09/30) includes further bug fixes to cgo, the runtime package, and the nacl port.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.3.3">change history</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.2">go1.2 (released 2013/12/01)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.2 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.2">Go 1.2 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.2.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.2.1 (released 2014/03/02) includes bug fixes to the <code>runtime</code>, <code>net</code>, and <code>database/sql</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.2.1">change history</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.2.2 (released 2014/05/05) includes a
|
|
||||||
<a href="https://github.com/golang/go/commits/go1.2.2">security fix</a>
|
|
||||||
that affects the tour binary included in the binary distributions (thanks to Guillaume T).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1.1">go1.1 (released 2013/05/13)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1.1 is a major release of Go.
|
|
||||||
Read the <a href="/doc/go1.1">Go 1.1 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.1.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.1.1 (released 2013/06/13) includes several compiler and runtime bug fixes.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.1.1">change history</a> for details.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.1.2 (released 2013/08/13) includes fixes to the <code>gc</code> compiler
|
|
||||||
and <code>cgo</code>, and the <code>bufio</code>, <code>runtime</code>,
|
|
||||||
<code>syscall</code>, and <code>time</code> packages.
|
|
||||||
See the <a href="https://github.com/golang/go/commits/go1.1.2">change history</a> for details.
|
|
||||||
If you use package syscall's <code>Getrlimit</code> and <code>Setrlimit</code>
|
|
||||||
functions under Linux on the ARM or 386 architectures, please note change
|
|
||||||
<a href="//golang.org/cl/11803043">11803043</a>
|
|
||||||
that fixes <a href="//golang.org/issue/5949">issue 5949</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="go1">go1 (released 2012/03/28)</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Go 1 is a major release of Go that will be stable in the long term.
|
|
||||||
Read the <a href="/doc/go1.html">Go 1 Release Notes</a> for more information.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
It is intended that programs written for Go 1 will continue to compile and run
|
|
||||||
correctly, unchanged, under future versions of Go 1.
|
|
||||||
Read the <a href="/doc/go1compat.html">Go 1 compatibility document</a> for more
|
|
||||||
about the future of Go 1.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The go1 release corresponds to
|
|
||||||
<code><a href="weekly.html#2012-03-27">weekly.2012-03-27</a></code>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="go1.minor">Minor revisions</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.0.1 (released 2012/04/25) was issued to
|
|
||||||
<a href="//golang.org/cl/6061043">fix</a> an
|
|
||||||
<a href="//golang.org/issue/3545">escape analysis bug</a>
|
|
||||||
that can lead to memory corruption.
|
|
||||||
It also includes several minor code and documentation fixes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.0.2 (released 2012/06/13) was issued to fix two bugs in the implementation
|
|
||||||
of maps using struct or array keys:
|
|
||||||
<a href="//golang.org/issue/3695">issue 3695</a> and
|
|
||||||
<a href="//golang.org/issue/3573">issue 3573</a>.
|
|
||||||
It also includes many minor code and documentation fixes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
go1.0.3 (released 2012/09/21) includes minor code and documentation fixes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
See the <a href="https://github.com/golang/go/commits/release-branch.go1">go1 release branch history</a> for the complete list of changes.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2 id="pre.go1">Older releases</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
See the <a href="pre_go1.html">Pre-Go 1 Release History</a> page for notes
|
|
||||||
on earlier releases.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -2695,8 +2695,7 @@ type ReadWriter interface {
|
||||||
<p>
|
<p>
|
||||||
This says just what it looks like: A <code>ReadWriter</code> can do
|
This says just what it looks like: A <code>ReadWriter</code> can do
|
||||||
what a <code>Reader</code> does <em>and</em> what a <code>Writer</code>
|
what a <code>Reader</code> does <em>and</em> what a <code>Writer</code>
|
||||||
does; it is a union of the embedded interfaces (which must be disjoint
|
does; it is a union of the embedded interfaces.
|
||||||
sets of methods).
|
|
||||||
Only interfaces can be embedded within interfaces.
|
Only interfaces can be embedded within interfaces.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
|
|
||||||
|
|
@ -826,7 +826,7 @@ for k := range m {
|
||||||
|
|
||||||
<!-- CL 101715 was reverted -->
|
<!-- CL 101715 was reverted -->
|
||||||
|
|
||||||
<dl id="runtime-again"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
<dl id="pkg-runtime"><dt id="runtime-again"><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
|
||||||
<p><!-- CL 70993 -->
|
<p><!-- CL 70993 -->
|
||||||
|
|
|
||||||
|
|
@ -904,7 +904,7 @@ godoc
|
||||||
|
|
||||||
</dl><!-- reflect -->
|
</dl><!-- reflect -->
|
||||||
|
|
||||||
<dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
<dl id="pkg-runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p> <!-- CL 167780 -->
|
<p> <!-- CL 167780 -->
|
||||||
Tracebacks, <a href="/pkg/runtime/#Caller"><code>runtime.Caller</code></a>,
|
Tracebacks, <a href="/pkg/runtime/#Caller"><code>runtime.Caller</code></a>,
|
||||||
|
|
|
||||||
784
doc/go1.14.html
784
doc/go1.14.html
|
|
@ -1,7 +1,6 @@
|
||||||
<!--{
|
<!--{
|
||||||
"Title": "Go 1.14 Release Notes",
|
"Title": "Go 1.14 Release Notes",
|
||||||
"Path": "/doc/go1.14",
|
"Path": "/doc/go1.14"
|
||||||
"Template": true
|
|
||||||
}-->
|
}-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
@ -15,43 +14,47 @@ Do not send CLs removing the interior tags from such phrases.
|
||||||
main ul li { margin: 0.5em 0; }
|
main ul li { margin: 0.5em 0; }
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.14</h2>
|
<h2 id="introduction">Introduction to Go 1.14</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>
|
The latest Go release, version 1.14, arrives six months after <a href="go1.13">Go 1.13</a>.
|
||||||
Go 1.14 is not yet released. These are work-in-progress
|
Most of its changes are in the implementation of the toolchain, runtime, and libraries.
|
||||||
release notes. Go 1.14 is expected to be released in February 2020.
|
As always, the release maintains the Go 1 <a href="/doc/go1compat.html">promise of compatibility</a>.
|
||||||
</strong>
|
We expect almost all Go programs to continue to compile and run as before.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Module support in the <code>go</code> command is now ready for production use,
|
||||||
|
and we encourage all users to <a href="https://blog.golang.org/migrating-to-go-modules">migrate to Go
|
||||||
|
modules for dependency management</a>. If you are unable to migrate due to a problem in the Go
|
||||||
|
toolchain, please ensure that the problem has an
|
||||||
|
<a href="https://golang.org/issue?q=is%3Aissue+is%3Aopen+label%3Amodules">open issue</a>
|
||||||
|
filed. (If the issue is not on the <code>Go1.15</code> milestone, please let us
|
||||||
|
know why it prevents you from migrating so that we can prioritize it
|
||||||
|
appropriately.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="language">Changes to the language</h2>
|
<h2 id="language">Changes to the language</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
TODO
|
Per the <a href="https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md">overlapping interfaces proposal</a>,
|
||||||
|
Go 1.14 now permits embedding of interfaces with overlapping method sets:
|
||||||
|
methods from an embedded interface may have the same names and identical signatures
|
||||||
|
as methods already present in the (embedding) interface. This solves problems that typically
|
||||||
|
(but not exclusively) occur with diamond-shaped embedding graphs.
|
||||||
|
Explicitly declared methods in an interface must remain
|
||||||
|
<a href="https://tip.golang.org/ref/spec#Uniqueness_of_identifiers">unique</a>, as before.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="ports">Ports</h2>
|
<h2 id="ports">Ports</h2>
|
||||||
|
|
||||||
<p>
|
|
||||||
TODO: is Dragonfly passing? On both Dragonfly release & tip? (ABI
|
|
||||||
change happened) Does the net package's interface APIs work on both?
|
|
||||||
https://golang.org/issue/34368.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
TODO: is Illumos up with a builder and passing?
|
|
||||||
https://golang.org/issue/15581.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
TODO: announce something about the Go Solaris port? Solaris itself
|
|
||||||
is unmaintained? The builder is still running at Oracle, but the
|
|
||||||
employee who set it up left the company and we have no way to
|
|
||||||
maintain it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="darwin">Darwin</h3>
|
<h3 id="darwin">Darwin</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Go 1.14 is the last release that will run on macOS 10.11 El Capitan.
|
||||||
|
Go 1.15 will require macOS 10.12 Sierra or later.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/34749 -->
|
<p><!-- golang.org/issue/34749 -->
|
||||||
Go 1.14 is the last Go release to support 32-bit binaries on
|
Go 1.14 is the last Go release to support 32-bit binaries on
|
||||||
macOS (the <code>darwin/386</code> port). They are no longer
|
macOS (the <code>darwin/386</code> port). They are no longer
|
||||||
|
|
@ -66,6 +69,61 @@ TODO
|
||||||
64-bit <code>darwin/arm64</code> port.
|
64-bit <code>darwin/arm64</code> port.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3 id="windows">Windows</h3>
|
||||||
|
|
||||||
|
<p><!-- CL 203601 -->
|
||||||
|
Go binaries on Windows now
|
||||||
|
have <a href="https://docs.microsoft.com/en-us/windows/win32/memory/data-execution-prevention">DEP
|
||||||
|
(Data Execution Prevention)</a> enabled.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 202439 -->
|
||||||
|
On Windows, creating a file
|
||||||
|
via <a href="/pkg/os#CreateFile"><code>os.OpenFile</code></a> with
|
||||||
|
the <a href="/pkg/os/#O_CREATE"><code>os.O_CREATE</code></a> flag, or
|
||||||
|
via <a href="/pkg/syscall#Open"><code>syscall.Open</code></a> with
|
||||||
|
the <a href="/pkg/syscall#O_CREAT"><code>syscall.O_CREAT</code></a>
|
||||||
|
flag, will now create the file as read-only if the
|
||||||
|
bit <code>0o200</code> (owner write permission) is not set in the
|
||||||
|
permission argument. This makes the behavior on Windows more like
|
||||||
|
that on Unix systems.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="wasm">WebAssembly</h3>
|
||||||
|
|
||||||
|
<p><!-- CL 203600 -->
|
||||||
|
JavaScript values referenced from Go via <code>js.Value</code>
|
||||||
|
objects can now be garbage collected.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 203600 -->
|
||||||
|
<code>js.Value</code> values can no longer be compared using
|
||||||
|
the <code>==</code> operator, and instead must be compared using
|
||||||
|
their <code>Equal</code> method.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 203600 -->
|
||||||
|
<code>js.Value</code> now
|
||||||
|
has <code>IsUndefined</code>, <code>IsNull</code>,
|
||||||
|
and <code>IsNaN</code> methods.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="riscv">RISC-V</h3>
|
||||||
|
|
||||||
|
<p><!-- Issue 27532 -->
|
||||||
|
Go 1.14 contains experimental support for 64-bit RISC-V on Linux
|
||||||
|
(<code>GOOS=linux</code>, <code>GOARCH=riscv64</code>). Be aware
|
||||||
|
that performance, assembly syntax stability, and possibly
|
||||||
|
correctness are a work in progress.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="freebsd">FreeBSD</h3>
|
||||||
|
|
||||||
|
<p><!-- CL 199919 -->
|
||||||
|
Go now supports the 64-bit ARM architecture on FreeBSD 12.0 or later (the
|
||||||
|
<code>freebsd/arm64</code> port).
|
||||||
|
</p>
|
||||||
|
|
||||||
<h3 id="nacl">Native Client (NaCl)</h3>
|
<h3 id="nacl">Native Client (NaCl)</h3>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/30439 -->
|
<p><!-- golang.org/issue/30439 -->
|
||||||
|
|
@ -73,12 +131,17 @@ TODO
|
||||||
Go 1.14 drops support for the Native Client platform (<code>GOOS=nacl</code>).
|
Go 1.14 drops support for the Native Client platform (<code>GOOS=nacl</code>).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="tools">Tools</h2>
|
<h3 id="illumos">Illumos</h3>
|
||||||
|
|
||||||
<p>
|
<p><!-- CL 203758 -->
|
||||||
TODO
|
The runtime now respects zone CPU caps
|
||||||
|
(the <code>zone.cpu-cap</code> resource control)
|
||||||
|
for <code>runtime.NumCPU</code> and the default value
|
||||||
|
of <code>GOMAXPROCS</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h2 id="tools">Tools</h2>
|
||||||
|
|
||||||
<h3 id="go-command">Go command</h3>
|
<h3 id="go-command">Go command</h3>
|
||||||
|
|
||||||
<h4 id="vendor">Vendoring</h4>
|
<h4 id="vendor">Vendoring</h4>
|
||||||
|
|
@ -105,7 +168,8 @@ TODO
|
||||||
<code>go</code> <code>list</code> <code>-m</code> no longer silently omits
|
<code>go</code> <code>list</code> <code>-m</code> no longer silently omits
|
||||||
transitive dependencies that do not provide packages in
|
transitive dependencies that do not provide packages in
|
||||||
the <code>vendor</code> directory. It now fails explicitly if
|
the <code>vendor</code> directory. It now fails explicitly if
|
||||||
<code>-mod=vendor</code> is set.
|
<code>-mod=vendor</code> is set and information is requested for a module not
|
||||||
|
mentioned in <code>vendor/modules.txt</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4 id="go-flags">Flags</h4>
|
<h4 id="go-flags">Flags</h4>
|
||||||
|
|
@ -117,6 +181,11 @@ TODO
|
||||||
<a href="https://golang.org/issue/32502">caused the build to fail</a>.
|
<a href="https://golang.org/issue/32502">caused the build to fail</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p><!-- golang.org/issue/33326 -->
|
||||||
|
<code>-mod=readonly</code> is now set by default when the <code>go.mod</code>
|
||||||
|
file is read-only and no top-level <code>vendor</code> directory is present.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/31481 -->
|
<p><!-- golang.org/issue/31481 -->
|
||||||
<code>-modcacherw</code> is a new flag that instructs the <code>go</code>
|
<code>-modcacherw</code> is a new flag that instructs the <code>go</code>
|
||||||
command to leave newly-created directories in the module cache at their
|
command to leave newly-created directories in the module cache at their
|
||||||
|
|
@ -130,12 +199,48 @@ TODO
|
||||||
|
|
||||||
<p><!-- golang.org/issue/34506 -->
|
<p><!-- golang.org/issue/34506 -->
|
||||||
<code>-modfile=file</code> is a new flag that instructs the <code>go</code>
|
<code>-modfile=file</code> is a new flag that instructs the <code>go</code>
|
||||||
command to read (and possibly write) an alternate go.mod file instead of the
|
command to read (and possibly write) an alternate <code>go.mod</code> file
|
||||||
one in the module root directory. A file named "go.mod" must still be present
|
instead of the one in the module root directory. A file
|
||||||
in order to determine the module root directory, but it is not
|
named <code>go.mod</code> must still be present in order to determine the
|
||||||
accessed. When <code>-modfile</code> is specified, an alternate go.sum file
|
module root directory, but it is not accessed. When <code>-modfile</code> is
|
||||||
is also used: its path is derived from the <code>-modfile</code> flag by
|
specified, an alternate <code>go.sum</code> file is also used: its path is
|
||||||
trimming the ".mod" extension and appending ".sum".
|
derived from the <code>-modfile</code> flag by trimming the <code>.mod</code>
|
||||||
|
extension and appending <code>.sum</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4 id="go-env-vars">Environment variables</h4>
|
||||||
|
|
||||||
|
<p><!-- golang.org/issue/32966 -->
|
||||||
|
<code>GOINSECURE</code> is a new environment variable that instructs
|
||||||
|
the <code>go</code> command to not require an HTTPS connection, and to skip
|
||||||
|
certificate validation, when fetching certain modules directly from their
|
||||||
|
origins. Like the existing <code>GOPRIVATE</code> variable, the value
|
||||||
|
of <code>GOINSECURE</code> is a comma-separated list of glob patterns.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4 id="commands-outside-modules">Commands outside modules</h4>
|
||||||
|
|
||||||
|
<p><!-- golang.org/issue/32027 -->
|
||||||
|
When module-aware mode is enabled explicitly (by setting
|
||||||
|
<code>GO111MODULE=on</code>), most module commands have more
|
||||||
|
limited functionality if no <code>go.mod</code> file is present. For
|
||||||
|
example, <code>go</code> <code>build</code>,
|
||||||
|
<code>go</code> <code>run</code>, and other build commands can only build
|
||||||
|
packages in the standard library and packages specified as <code>.go</code>
|
||||||
|
files on the command line.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Previously, the <code>go</code> command would resolve each package path
|
||||||
|
to the latest version of a module but would not record the module path
|
||||||
|
or version. This resulted in <a href="https://golang.org/issue/32027">slow,
|
||||||
|
non-reproducible builds</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>go</code> <code>get</code> continues to work as before, as do
|
||||||
|
<code>go</code> <code>mod</code> <code>download</code> and
|
||||||
|
<code>go</code> <code>list</code> <code>-m</code> with explicit versions.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4 id="incompatible-versions"><code>+incompatible</code> versions</h4>
|
<h4 id="incompatible-versions"><code>+incompatible</code> versions</h4>
|
||||||
|
|
@ -152,6 +257,30 @@ TODO
|
||||||
include them if reported by a proxy.
|
include them if reported by a proxy.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4 id="go.mod"><code>go.mod</code> file maintenance</h4>
|
||||||
|
<!-- golang.org/issue/34822 -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>go</code> commands other than
|
||||||
|
<code>go</code> <code>mod</code> <code>tidy</code> no longer
|
||||||
|
remove a <code>require</code> directive that specifies a version of an indirect dependency
|
||||||
|
that is already implied by other (transitive) dependencies of the main
|
||||||
|
module.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<code>go</code> commands other than
|
||||||
|
<code>go</code> <code>mod</code> <code>tidy</code> no longer
|
||||||
|
edit the <code>go.mod</code> file if the changes are only cosmetic.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When <code>-mod=readonly</code> is set, <code>go</code> commands will no
|
||||||
|
longer fail due to a missing <code>go</code> directive or an erroneous
|
||||||
|
<code>// indirect</code> comment.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h4 id="module-downloading">Module downloading</h4>
|
<h4 id="module-downloading">Module downloading</h4>
|
||||||
|
|
||||||
<p><!-- golang.org/issue/26092 -->
|
<p><!-- golang.org/issue/26092 -->
|
||||||
|
|
@ -165,62 +294,370 @@ TODO
|
||||||
graphic characters and spaces.
|
graphic characters and spaces.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="runtime">Runtime</h2>
|
<h4 id="go-test">Testing</h4>
|
||||||
|
|
||||||
<p>
|
<p><!-- golang.org/issue/24929 -->
|
||||||
TODO
|
<code>go test -v</code> now streams <code>t.Log</code> output as it happens,
|
||||||
|
rather than at the end of all tests.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h2 id="runtime">Runtime</h2>
|
||||||
|
|
||||||
|
<p><!-- CL 190098 -->
|
||||||
|
This release improves the performance of most uses
|
||||||
|
of <code>defer</code> to incur almost zero overhead compared to
|
||||||
|
calling the deferred function directly.
|
||||||
|
As a result, <code>defer</code> can now be used in
|
||||||
|
performance-critical code without overhead concerns.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 201760, CL 201762 and many others -->
|
||||||
|
Goroutines are now asynchronously preemptible.
|
||||||
|
As a result, loops without function calls no longer potentially
|
||||||
|
deadlock the scheduler or significantly delay garbage collection.
|
||||||
|
This is supported on all platforms except <code>windows/arm</code>,
|
||||||
|
<code>darwin/arm</code>, <code>js/wasm</code>, and
|
||||||
|
<code>plan9/*</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A consequence of the implementation of preemption is that on Unix
|
||||||
|
systems, including Linux and macOS systems, programs built with Go
|
||||||
|
1.14 will receive more signals than programs built with earlier
|
||||||
|
releases.
|
||||||
|
This means that programs that use packages
|
||||||
|
like <a href="/pkg/syscall/"><code>syscall</code></a>
|
||||||
|
or <a href="https://godoc.org/golang.org/x/sys/unix"><code>golang.org/x/sys/unix</code></a>
|
||||||
|
will see more slow system calls fail with <code>EINTR</code> errors.
|
||||||
|
Those programs will have to handle those errors in some way, most
|
||||||
|
likely looping to try the system call again. For more
|
||||||
|
information about this
|
||||||
|
see <a href="http://man7.org/linux/man-pages/man7/signal.7.html"><code>man
|
||||||
|
7 signal</code></a> for Linux systems or similar documentation for
|
||||||
|
other systems.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 201765, CL 195701 and many others -->
|
||||||
|
The page allocator is more efficient and incurs significantly less
|
||||||
|
lock contention at high values of <code>GOMAXPROCS</code>.
|
||||||
|
This is most noticeable as lower latency and higher throughput for
|
||||||
|
large allocations being done in parallel and at a high rate.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 171844 and many others -->
|
||||||
|
Internal timers, used by
|
||||||
|
<a href="/pkg/time/#After"><code>time.After</code></a>,
|
||||||
|
<a href="/pkg/time/#Tick"><code>time.Tick</code></a>,
|
||||||
|
<a href="/pkg/net/#Conn"><code>net.Conn.SetDeadline</code></a>,
|
||||||
|
and friends, are more efficient, with less lock contention and fewer
|
||||||
|
context switches.
|
||||||
|
This is a performance improvement that should not cause any user
|
||||||
|
visible changes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="compiler">Compiler</h2>
|
||||||
|
|
||||||
|
<p><!-- CL 162237 -->
|
||||||
|
This release adds <code>-d=checkptr</code> as a compile-time option
|
||||||
|
for adding instrumentation to check that Go code is following
|
||||||
|
<code>unsafe.Pointer</code> safety rules dynamically.
|
||||||
|
This option is enabled by default (except on Windows) with
|
||||||
|
the <code>-race</code> or <code>-msan</code> flags, and can be
|
||||||
|
disabled with <code>-gcflags=all=-d=checkptr=0</code>.
|
||||||
|
Specifically, <code>-d=checkptr</code> checks the following:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
When converting <code>unsafe.Pointer</code> to <code>*T</code>,
|
||||||
|
the resulting pointer must be aligned appropriately
|
||||||
|
for <code>T</code>.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
If the result of pointer arithmetic points into a Go heap object,
|
||||||
|
one of the <code>unsafe.Pointer</code>-typed operands must point
|
||||||
|
into the same object.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Using <code>-d=checkptr</code> is not currently recommended on
|
||||||
|
Windows because it causes false alerts in the standard library.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 204338 -->
|
||||||
|
The compiler can now emit machine-readable logs of key optimizations
|
||||||
|
using the <code>-json</code> flag, including inlining, escape
|
||||||
|
analysis, bounds-check elimination, and nil-check elimination.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 196959 -->
|
||||||
|
Detailed escape analysis diagnostics (<code>-m=2</code>) now work again.
|
||||||
|
This had been dropped from the new escape analysis implementation in
|
||||||
|
the previous release.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 196217 -->
|
||||||
|
All Go symbols in macOS binaries now begin with an underscore,
|
||||||
|
following platform conventions.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 202117 -->
|
||||||
|
This release includes experimental support for compiler-inserted
|
||||||
|
coverage instrumentation for fuzzing.
|
||||||
|
See <a href="https://golang.org/issue/14565">issue 14565</a> for more
|
||||||
|
details.
|
||||||
|
This API may change in future releases.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 174704 --><!-- CL 196784 -->
|
||||||
|
Bounds check elimination now uses information from slice creation and can
|
||||||
|
eliminate checks for indexes with types smaller than <code>int</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="library">Core library</h2>
|
<h2 id="library">Core library</h2>
|
||||||
|
|
||||||
|
<h3 id="hash/maphash">New byte sequence hashing package</h3>
|
||||||
|
|
||||||
|
<p> <!-- golang.org/issue/28322, CL 186877 -->
|
||||||
|
Go 1.14 includes a new package,
|
||||||
|
<a href="/pkg/hash/maphash/"><code>hash/maphash</code></a>,
|
||||||
|
which provides hash functions on byte sequences.
|
||||||
|
These hash functions are intended to be used to implement hash tables or
|
||||||
|
other data structures that need to map arbitrary strings or byte
|
||||||
|
sequences to a uniform distribution on unsigned 64-bit integers.
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
TODO
|
The hash functions are collision-resistant but not cryptographically secure.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The hash value of a given byte sequence is consistent within a
|
||||||
|
single process, but will be different in different processes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<dl id="bytes/hash"><dt><a href="/pkg/bytes/hash/">bytes/hash</a></dt>
|
<h3 id="minor_library_changes">Minor changes to the library</h3>
|
||||||
<dd>
|
|
||||||
<p><!-- CL 186877 -->
|
|
||||||
TODO: <a href="https://golang.org/cl/186877">https://golang.org/cl/186877</a>: add hashing package for bytes and strings
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</dl><!-- bytes/hash -->
|
<p>
|
||||||
|
As always, there are various minor changes and updates to the library,
|
||||||
|
made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
|
||||||
|
in mind.
|
||||||
|
</p>
|
||||||
|
|
||||||
<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
|
<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 191976 -->
|
<p><!-- CL 191976 -->
|
||||||
TODO: <a href="https://golang.org/cl/191976">https://golang.org/cl/191976</a>: remove SSLv3 support
|
Support for SSL version 3.0 (SSLv3) has been removed. Note that SSLv3 is the
|
||||||
|
<a href="https://tools.ietf.org/html/rfc7568">cryptographically broken</a>
|
||||||
|
protocol predating TLS.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- CL 191999 -->
|
<p><!-- CL 191999 -->
|
||||||
TODO: <a href="https://golang.org/cl/191999">https://golang.org/cl/191999</a>: remove TLS 1.3 opt-out
|
TLS 1.3 can't be disabled via the <code>GODEBUG</code> environment
|
||||||
|
variable anymore. Use the
|
||||||
|
<a href="/pkg/crypto/tls/#Config.MaxVersion"><code>Config.MaxVersion</code></a>
|
||||||
|
field to configure TLS versions.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205059 -->
|
||||||
|
When multiple certificate chains are provided through the
|
||||||
|
<a href="/pkg/crypto/tls/#Config.Certificates"><code>Config.Certificates</code></a>
|
||||||
|
field, the first one compatible with the peer is now automatically
|
||||||
|
selected. This allows for example providing an ECDSA and an RSA
|
||||||
|
certificate, and letting the package automatically select the best one.
|
||||||
|
Note that the performance of this selection is going to be poor unless the
|
||||||
|
<a href="/pkg/crypto/tls/#Certificate.Leaf"><code>Certificate.Leaf</code></a>
|
||||||
|
field is set.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 175517 -->
|
||||||
|
The new <a href="/pkg/crypto/tls/#CipherSuites"><code>CipherSuites</code></a>
|
||||||
|
and <a href="/pkg/crypto/tls/#InsecureCipherSuites"><code>InsecureCipherSuites</code></a>
|
||||||
|
functions return a list of currently implemented cipher suites.
|
||||||
|
The new <a href="/pkg/crypto/tls/#CipherSuiteName"><code>CipherSuiteName</code></a>
|
||||||
|
function returns a name for a cipher suite ID.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205058, 205057 -->
|
||||||
|
The new <a href="/pkg/crypto/tls/#ClientHelloInfo.SupportsCertificate">
|
||||||
|
<code>(*ClientHelloInfo).SupportsCertificate</code></a> and
|
||||||
|
<a href="/pkg/crypto/tls/#CertificateRequestInfo.SupportsCertificate">
|
||||||
|
<code>(*CertificateRequestInfo).SupportsCertificate</code></a>
|
||||||
|
methods expose whether a peer supports a certain certificate.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- CL 174329 -->
|
<p><!-- CL 174329 -->
|
||||||
The <code>tls</code> package no longer supports NPN and now only
|
The <code>tls</code> package no longer supports the legacy Next Protocol
|
||||||
supports ALPN. In previous releases it supported both. There are
|
Negotiation (NPN) extension and now only supports ALPN. In previous
|
||||||
no API changes and code should function identically as before.
|
releases it supported both. There are no API changes and applications
|
||||||
Most other clients & servers have already removed NPN support in
|
should function identically as before. Most other clients and servers have
|
||||||
favor of the standardized ALPN.
|
already removed NPN support in favor of the standardized ALPN.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205063, 205062 -->
|
||||||
|
RSA-PSS signatures are now used when supported in TLS 1.2 handshakes. This
|
||||||
|
won't affect most applications, but custom
|
||||||
|
<a href="/pkg/crypto/tls/#Certificate.PrivateKey"><code>Certificate.PrivateKey</code></a>
|
||||||
|
implementations that don't support RSA-PSS signatures will need to use the new
|
||||||
|
<a href="/pkg/crypto/tls/#Certificate.SupportedSignatureAlgorithms">
|
||||||
|
<code>Certificate.SupportedSignatureAlgorithms</code></a>
|
||||||
|
field to disable them.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205059, 205059 -->
|
||||||
|
<a href="/pkg/crypto/tls/#Config.Certificates"><code>Config.Certificates</code></a> and
|
||||||
|
<a href="/pkg/crypto/tls/#Config.GetCertificate"><code>Config.GetCertificate</code></a>
|
||||||
|
can now both be nil if
|
||||||
|
<a href="/pkg/crypto/tls/#Config.GetConfigForClient"><code>Config.GetConfigForClient</code></a>
|
||||||
|
is set. If the callbacks return neither certificates nor an error, the
|
||||||
|
<code>unrecognized_name</code> is now sent.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205058 -->
|
||||||
|
The new <a href="/pkg/crypto/tls/#CertificateRequestInfo.Version"><code>CertificateRequestInfo.Version</code></a>
|
||||||
|
field provides the TLS version to client certificates callbacks.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 205068 -->
|
||||||
|
The new <code>TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256</code> and
|
||||||
|
<code>TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256</code> constants use
|
||||||
|
the final names for the cipher suites previously referred to as
|
||||||
|
<code>TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305</code> and
|
||||||
|
<code>TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- crypto/tls -->
|
</dl><!-- crypto/tls -->
|
||||||
|
|
||||||
|
<dl id="crypto/x509"><dt><a href="/pkg/crypto/x509/">crypto/x509</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 204046 -->
|
||||||
|
<a href="/pkg/crypto/x509/#Certificate.CreateCRL"><code>Certificate.CreateCRL</code></a>
|
||||||
|
now supports Ed25519 issuers.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl id="debug/dwarf"><dt><a href="/pkg/debug/dwarf/">debug/dwarf</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 175138 -->
|
||||||
|
The <code>debug/dwarf</code> package now supports reading DWARF
|
||||||
|
version 5.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The new
|
||||||
|
method <a href="/pkg/debug/dwarf/#Data.AddSection"><code>(*Data).AddSection</code></a>
|
||||||
|
supports adding arbitrary new DWARF sections from the input file
|
||||||
|
to the DWARF <code>Data</code>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 192698 -->
|
||||||
|
The new
|
||||||
|
method <a href="/pkg/debug/dwarf/#Reader.ByteOrder"><code>(*Reader).ByteOrder</code></a>
|
||||||
|
returns the byte order of the current compilation unit.
|
||||||
|
This may be used to interpret attributes that are encoded in the
|
||||||
|
native ordering, such as location descriptions.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 192699 -->
|
||||||
|
The new
|
||||||
|
method <a href="/pkg/debug/dwarf/#LineReader.Files"><code>(*LineReader).Files</code></a>
|
||||||
|
returns the file name table from a line reader.
|
||||||
|
This may be used to interpret the value of DWARF attributes such
|
||||||
|
as <code>AttrDeclFile</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- debug/dwarf -->
|
||||||
|
|
||||||
<dl id="encoding/asn1"><dt><a href="/pkg/encoding/asn1/">encoding/asn1</a></dt>
|
<dl id="encoding/asn1"><dt><a href="/pkg/encoding/asn1/">encoding/asn1</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 126624 -->
|
<p><!-- CL 126624 -->
|
||||||
TODO: <a href="https://golang.org/cl/126624">https://golang.org/cl/126624</a>: handle ASN1's string type BMPString
|
<a href="/pkg/encoding/asn1/#Unmarshal"><code>Unmarshal</code></a>
|
||||||
|
now supports ASN.1 string type BMPString, represented by the new
|
||||||
|
<a href="/pkg/encoding/asn1/#TagBMPString"><code>TagBMPString</code></a>
|
||||||
|
constant.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- encoding/asn1 -->
|
</dl><!-- encoding/asn1 -->
|
||||||
|
|
||||||
<dl id="mime"><dt><a href="/pkg/mime/">mime</a></dt>
|
<dl id="encoding/json"><dt><a href="/pkg/encoding/json/">encoding/json</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 186927 -->
|
<p><!-- CL 200677 -->
|
||||||
TODO: <a href="https://golang.org/cl/186927">https://golang.org/cl/186927</a>: update type of .js and .mjs files to text/javascript
|
The <a href="/pkg/encoding/json/#Decoder"><code>Decoder</code></a>
|
||||||
|
type supports a new
|
||||||
|
method <a href="/pkg/encoding/json/#Decoder.InputOffset"><code>InputOffset</code></a>
|
||||||
|
that returns the input stream byte offset of the current
|
||||||
|
decoder position.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</dl><!-- mime -->
|
<p><!-- CL 200217 -->
|
||||||
|
<a href="/pkg/encoding/json/#Compact"><code>Compact</code></a> no longer
|
||||||
|
escapes the <code>U+2028</code> and <code>U+2029</code> characters, which
|
||||||
|
was never a documented feature. For proper escaping, see <a
|
||||||
|
href="/pkg/encoding/json/#HTMLEscape"><code>HTMLEscape</code></a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 195045 -->
|
||||||
|
<a href="/pkg/encoding/json/#Number"><code>Number</code></a> no longer
|
||||||
|
accepts invalid numbers, to follow the documented behavior more closely.
|
||||||
|
If a program needs to accept invalid numbers like the empty string,
|
||||||
|
consider wrapping the type with <a href="/pkg/encoding/json/#Unmarshaler"><code>Unmarshaler</code></a>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- encoding/json -->
|
||||||
|
|
||||||
|
<dl id="go/build"><dt><a href="/pkg/go/build/">go/build</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 203820, 211657 -->
|
||||||
|
The <a href="/pkg/go/build/#Context"><code>Context</code></a>
|
||||||
|
type has a new field <code>Dir</code> which may be used to set
|
||||||
|
the working directory for the build.
|
||||||
|
The default is the current directory of the running process.
|
||||||
|
In module mode, this is used to locate the main module.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- go/build -->
|
||||||
|
|
||||||
|
<dl id="go/doc"><dt><a href="/pkg/go/doc/">go/doc</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 204830 -->
|
||||||
|
The new
|
||||||
|
function <a href="/pkg/go/doc/#NewFromFiles"><code>NewFromFiles</code></a>
|
||||||
|
computes package documentation from a list
|
||||||
|
of <code>*ast.File</code>'s and associates examples with the
|
||||||
|
appropriate package elements.
|
||||||
|
The new information is available in a new <code>Examples</code>
|
||||||
|
field
|
||||||
|
in the <a href="/pkg/go/doc/#Package"><code>Package</code></a>, <a href="/pkg/go/doc/#Type"><code>Type</code></a>,
|
||||||
|
and <a href="/pkg/go/doc/#Func"><code>Func</code></a> types, and a
|
||||||
|
new <a href="/pkg/go/doc/#Example.Suffix"><code>Suffix</code></a>
|
||||||
|
field in
|
||||||
|
the <a href="/pkg/go/doc/#Example"><code>Example</code></a>
|
||||||
|
type.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- go/doc -->
|
||||||
|
|
||||||
|
<dl id="io/ioutil"><dt><a href="/pkg/io/ioutil/">io/ioutil</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 198488 -->
|
||||||
|
<a href="/pkg/io/ioutil/#TempDir"><code>TempDir</code></a> can now create directories
|
||||||
|
whose names have predictable prefixes and suffixes.
|
||||||
|
As with <a href="/pkg/io/ioutil/#TempFile"><code>TempFile</code></a>, if the pattern
|
||||||
|
contains a '*', the random string replaces the last '*'.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl id="log"><dt><a href="/pkg/log/">log</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 186182 -->
|
||||||
|
The
|
||||||
|
new <a href="https://tip.golang.org/pkg/log/#pkg-constants"><code>Lmsgprefix</code></a>
|
||||||
|
flag may be used to tell the logging functions to emit the
|
||||||
|
optional output prefix immediately before the log message rather
|
||||||
|
than at the start of the line.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- log -->
|
||||||
|
|
||||||
<dl id="math"><dt><a href="/pkg/math/">math</a></dt>
|
<dl id="math"><dt><a href="/pkg/math/">math</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
|
@ -231,20 +668,143 @@ TODO
|
||||||
computation. Several architectures implement this computation
|
computation. Several architectures implement this computation
|
||||||
using dedicated hardware instructions for additional performance.
|
using dedicated hardware instructions for additional performance.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- math -->
|
</dl><!-- math -->
|
||||||
|
|
||||||
|
<dl id="math/big"><dt><a href="/pkg/math/big/">math/big</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 164972 -->
|
||||||
|
The <a href="/pkg/math/big/#Int.GCD"><code>GCD</code></a> method
|
||||||
|
now allows the inputs <code>a</code> and <code>b</code> to be
|
||||||
|
zero or negative.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- math/big -->
|
||||||
|
|
||||||
|
<dl id="math/bits"><dt><a href="/pkg/math/bits/">math/bits</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 197838 -->
|
||||||
|
The new functions
|
||||||
|
<a href="/pkg/math/bits/#Rem"><code>Rem</code></a>,
|
||||||
|
<a href="/pkg/math/bits/#Rem32"><code>Rem32</code></a>, and
|
||||||
|
<a href="/pkg/math/bits/#Rem64"><code>Rem64</code></a>
|
||||||
|
support computing a remainder even when the quotient overflows.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- math/bits -->
|
||||||
|
|
||||||
|
<dl id="mime"><dt><a href="/pkg/mime/">mime</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 186927 -->
|
||||||
|
The default type of <code>.js</code> and <code>.mjs</code> files
|
||||||
|
is now <code>text/javascript</code> rather
|
||||||
|
than <code>application/javascript</code>.
|
||||||
|
This is in accordance
|
||||||
|
with <a href="https://datatracker.ietf.org/doc/draft-ietf-dispatch-javascript-mjs/">an
|
||||||
|
IETF draft</a> that treats <code>application/javascript</code> as obsolete.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- mime -->
|
||||||
|
|
||||||
|
<dl id="mime/multipart"><dt><a href="/pkg/mime/multipart/">mime/multipart</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p>
|
||||||
|
The
|
||||||
|
new <a href="/pkg/mime/multipart/#Reader"><code>Reader</code></a>
|
||||||
|
method <a href="/pkg/mime/multipart/#Reader.NextRawPart"><code>NextRawPart</code></a>
|
||||||
|
supports fetching the next MIME part without transparently
|
||||||
|
decoding <code>quoted-printable</code> data.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- mime/multipart -->
|
||||||
|
|
||||||
|
<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 200760 -->
|
||||||
|
The new <a href="/pkg/net/http/#Header"><code>Header</code></a>
|
||||||
|
method <a href="/pkg/net/http/#Header.Values"><code>Values</code></a>
|
||||||
|
can be used to fetch all values associated with a
|
||||||
|
canonicalized key.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 61291 -->
|
||||||
|
The
|
||||||
|
new <a href="/pkg/net/http/#Transport"><code>Transport</code></a>
|
||||||
|
field <a href="/pkg/net/http/#Transport.DialTLSContext"><code>DialTLSContext</code></a>
|
||||||
|
can be used to specify an optional dial function for creating
|
||||||
|
TLS connections for non-proxied HTTPS requests.
|
||||||
|
This new field can be used instead
|
||||||
|
of <a href="/pkg/net/http/#Transport.DialTLS"><code>DialTLS</code></a>,
|
||||||
|
which is now considered deprecated; <code>DialTLS</code> will
|
||||||
|
continue to work, but new code should
|
||||||
|
use <code>DialTLSContext</code>, which allows the transport to
|
||||||
|
cancel dials as soon as they are no longer needed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><!-- CL 192518, CL 194218 -->
|
||||||
|
On Windows, <a href="/pkg/net/http/#ServeFile"><code>ServeFile</code></a> now correctly
|
||||||
|
serves files larger than 2GB.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net/http -->
|
||||||
|
|
||||||
|
<dl id="net/http/httptest"><dt><a href="/pkg/net/http/httptest/">net/http/httptest</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 201557 -->
|
||||||
|
The
|
||||||
|
new <a href="/pkg/net/http/httptest/#Server"><code>Server</code></a>
|
||||||
|
field <a href="/pkg/net/http/httptest/#Server.EnableHTTP2"><code>EnableHTTP2</code></a>
|
||||||
|
supports enabling HTTP/2 on the test server.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net/http/httptest -->
|
||||||
|
|
||||||
|
<dl id="net/textproto"><dt><a href="/pkg/net/textproto/">net/textproto</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 200760 -->
|
||||||
|
The
|
||||||
|
new <a href="/pkg/net/textproto/#MIMEHeader"><code>MIMEHeader</code></a>
|
||||||
|
method <a href="/pkg/net/textproto/#MIMEHeader.Values"><code>Values</code></a>
|
||||||
|
can be used to fetch all values associated with a canonicalized
|
||||||
|
key.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net/textproto -->
|
||||||
|
|
||||||
|
<dl id="net/url"><dt><a href="/pkg/net/url/">net/url</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 185117 -->
|
||||||
|
When parsing of a URL fails
|
||||||
|
(for example by <a href="/pkg/net/url/#Parse"><code>Parse</code></a>
|
||||||
|
or <a href="/pkg/net/url/#ParseRequestURI"><code>ParseRequestURI</code></a>),
|
||||||
|
the resulting <a href="/pkg/net/url/#Error.Error"><code>Error</code></a> message
|
||||||
|
will now quote the unparsable URL.
|
||||||
|
This provides clearer structure and consistency with other parsing errors.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- net/url -->
|
||||||
|
|
||||||
|
<dl id="os/signal"><dt><a href="/pkg/os/signal/">os/signal</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 187739 -->
|
||||||
|
On Windows,
|
||||||
|
the <code>CTRL_CLOSE_EVENT</code>, <code>CTRL_LOGOFF_EVENT</code>,
|
||||||
|
and <code>CTRL_SHUTDOWN_EVENT</code> events now generate
|
||||||
|
a <code>syscall.SIGTERM</code> signal, similar to how Control-C
|
||||||
|
and Control-Break generate a <code>syscall.SIGINT</code> signal.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- os/signal -->
|
||||||
|
|
||||||
<dl id="plugin"><dt><a href="/pkg/plugin/">plugin</a></dt>
|
<dl id="plugin"><dt><a href="/pkg/plugin/">plugin</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 191617 -->
|
<p><!-- CL 191617 -->
|
||||||
TODO: <a href="https://golang.org/cl/191617">https://golang.org/cl/191617</a>: add freebsd/amd64 plugin support
|
The <code>plugin</code> package now supports <code>freebsd/amd64</code>.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- plugin -->
|
</dl><!-- plugin -->
|
||||||
|
|
||||||
<dl id="reflect">
|
<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
|
||||||
|
|
||||||
<dt><a href="/pkg/reflect/">reflect</a></dt>
|
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 85661 -->
|
<p><!-- CL 85661 -->
|
||||||
<a href="/pkg/reflect#StructOf"><code>StructOf</code></a> now
|
<a href="/pkg/reflect#StructOf"><code>StructOf</code></a> now
|
||||||
|
|
@ -252,21 +812,67 @@ TODO
|
||||||
setting the <code>PkgPath</code> field in
|
setting the <code>PkgPath</code> field in
|
||||||
a <code>StructField</code> element.
|
a <code>StructField</code> element.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- reflect -->
|
</dl><!-- reflect -->
|
||||||
|
|
||||||
<dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
<dl id="pkg-runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 187739 -->
|
<p><!-- CL 200081 -->
|
||||||
TODO: <a href="https://golang.org/cl/187739">https://golang.org/cl/187739</a>: treat CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT as SIGTERM on Windows
|
<code>runtime.Goexit</code> can no longer be aborted by a
|
||||||
|
recursive <code>panic</code>/<code>recover</code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- CL 188297 -->
|
<p><!-- CL 188297, CL 191785 -->
|
||||||
TODO: <a href="https://golang.org/cl/188297">https://golang.org/cl/188297</a>: don't forward SIGPIPE on macOS
|
On macOS, <code>SIGPIPE</code> is no longer forwarded to signal
|
||||||
|
handlers installed before the Go runtime is initialized.
|
||||||
|
This is necessary because macOS delivers <code>SIGPIPE</code>
|
||||||
|
<a href="https://golang.org/issue/33384">to the main thread</a>
|
||||||
|
rather than the thread writing to the closed pipe.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- runtime -->
|
</dl><!-- runtime -->
|
||||||
|
|
||||||
|
<dl id="runtime/pprof"><dt><a href="/pkg/runtime/pprof/">runtime/pprof</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 204636, 205097 -->
|
||||||
|
The generated profile no longer includes the pseudo-PCs used for inline
|
||||||
|
marks. Symbol information of inlined functions is encoded in
|
||||||
|
<a href="https://github.com/google/pprof/blob/5e96527/proto/profile.proto#L177-L184">the format</a>
|
||||||
|
the pprof tool expects. This is a fix for the regression introduced
|
||||||
|
during recent releases.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- runtime/pprof -->
|
||||||
|
|
||||||
|
<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p>
|
||||||
|
The <a href="/pkg/strconv/#NumError"><code>NumError</code></a>
|
||||||
|
type now has
|
||||||
|
an <a href="/pkg/strconv/#NumError.Unwrap"><code>Unwrap</code></a>
|
||||||
|
method that may be used to retrieve the reason that a conversion
|
||||||
|
failed.
|
||||||
|
This supports using <code>NumError</code> values
|
||||||
|
with <a href="/pkg/errors/#Is"><code>errors.Is</code></a> to see
|
||||||
|
if the underlying error
|
||||||
|
is <a href="/pkg/strconv/#pkg-variables"><code>strconv.ErrRange</code></a>
|
||||||
|
or <a href="/pkg/strconv/#pkg-variables"><code>strconv.ErrSyntax</code></a>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- strconv -->
|
||||||
|
|
||||||
|
<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 200577 -->
|
||||||
|
Unlocking a highly contended <code>Mutex</code> now directly
|
||||||
|
yields the CPU to the next goroutine waiting for
|
||||||
|
that <code>Mutex</code>. This significantly improves the
|
||||||
|
performance of highly contended mutexes on high CPU count
|
||||||
|
machines.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- sync -->
|
||||||
|
|
||||||
<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
|
<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 201359 -->
|
<p><!-- CL 201359 -->
|
||||||
|
|
@ -275,16 +881,30 @@ TODO
|
||||||
<a href="/pkg/testing#T.Cleanup"><code>T.Cleanup</code></a> or
|
<a href="/pkg/testing#T.Cleanup"><code>T.Cleanup</code></a> or
|
||||||
<a href="/pkg/testing#B.Cleanup"><code>B.Cleanup</code></a> respectively.
|
<a href="/pkg/testing#B.Cleanup"><code>B.Cleanup</code></a> respectively.
|
||||||
</p>
|
</p>
|
||||||
|
</dd>
|
||||||
</dl><!-- testing -->
|
</dl><!-- testing -->
|
||||||
|
|
||||||
<h3 id="minor_library_changes">Minor changes to the library</h3>
|
<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 206124 -->
|
||||||
|
The text/template package now correctly reports errors when a
|
||||||
|
parenthesized argument is used as a function.
|
||||||
|
This most commonly shows up in erroneous cases like
|
||||||
|
<code>{{if (eq .F "a") or (eq .F "b")}}</code>.
|
||||||
|
This should be written as <code>{{if or (eq .F "a") (eq .F "b")}}</code>.
|
||||||
|
The erroneous case never worked as expected, and will now be
|
||||||
|
reported with an error <code>can't give argument to non-function</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- text/template -->
|
||||||
|
|
||||||
<p>
|
<dl id="unicode"><dt><a href="/pkg/unicode/">unicode</a></dt>
|
||||||
As always, there are various minor changes and updates to the library,
|
<dd>
|
||||||
made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
|
<p>
|
||||||
in mind.
|
The <a href="/pkg/unicode/"><code>unicode</code></a> package and associated
|
||||||
</p>
|
support throughout the system has been upgraded from Unicode 11.0 to
|
||||||
|
<a href="https://www.unicode.org/versions/Unicode12.0.0/">Unicode 12.0</a>,
|
||||||
<p>
|
which adds 554 new characters, including four new scripts, and 61 new emoji.
|
||||||
TODO
|
</p>
|
||||||
</p>
|
</dd>
|
||||||
|
</dl><!-- unicode -->
|
||||||
|
|
|
||||||
156
doc/go1.15.html
Normal file
156
doc/go1.15.html
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
<!--{
|
||||||
|
"Title": "Go 1.15 Release Notes",
|
||||||
|
"Path": "/doc/go1.15"
|
||||||
|
}-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
NOTE: In this document and others in this directory, the convention is to
|
||||||
|
set fixed-width phrases with non-fixed-width spaces, as in
|
||||||
|
<code>hello</code> <code>world</code>.
|
||||||
|
Do not send CLs removing the interior tags from such phrases.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<style>
|
||||||
|
main ul li { margin: 0.5em 0; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.15</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>
|
||||||
|
Go 1.15 is not yet released. These are work-in-progress
|
||||||
|
release notes. Go 1.15 is expected to be released in August 2020.
|
||||||
|
</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="language">Changes to the language</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="ports">Ports</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="tools">Tools</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 id="go-command">Go command</h3>
|
||||||
|
|
||||||
|
<p><!-- golang.org/issue/37367 -->
|
||||||
|
The <code>GOPROXY</code> environment variable now supports skipping proxies
|
||||||
|
that return errors. Proxy URLs may now be separated with either commas
|
||||||
|
(<code>,</code>) or pipe characters (<code>|</code>). If a proxy URL is
|
||||||
|
followed by a comma, the <code>go</code> command will only try the next proxy
|
||||||
|
in the list after a 404 or 410 HTTP response. If a proxy URL is followed by a
|
||||||
|
pipe character, the <code>go</code> command will try the next proxy in the
|
||||||
|
list after any error. Note that the default value of <code>GOPROXY</code>
|
||||||
|
remains <code>https://proxy.golang.org,direct</code>, which does not fall
|
||||||
|
back to <code>direct</code> in case of errors.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4 id="go-test"><code>go</code> <code>test</code></h4>
|
||||||
|
|
||||||
|
<p><!-- https://golang.org/issue/36134 -->
|
||||||
|
Changing the <code>-timeout</code> flag now invalidates cached test results. A
|
||||||
|
cached result for a test run with a long timeout will no longer count as
|
||||||
|
passing when <code>go</code> <code>test</code> is re-invoked with a short one.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h4 id="go-flag-parsing">Flag parsing</h4>
|
||||||
|
|
||||||
|
<p><!-- https://golang.org/cl/211358 -->
|
||||||
|
Various flag parsing issues in <code>go</code> <code>test</code> and
|
||||||
|
<code>go</code> <code>vet</code> have been fixed. Notably, flags specified
|
||||||
|
in <code>GOFLAGS</code> are handled more consistently, and
|
||||||
|
the <code>-outputdir</code> flag now interprets relative paths relative to the
|
||||||
|
working directory of the <code>go</code> command (rather than the working
|
||||||
|
directory of each individual test).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 id="runtime">Runtime</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2 id="library">Core library</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- golang.org/issue/28135 -->
|
||||||
|
The <code>testing.T</code> type now has a <code>Deadline</code> method
|
||||||
|
that reports the time at which the test binary will have exceeded its
|
||||||
|
timeout.
|
||||||
|
</p>
|
||||||
|
<p><!-- golang.org/issue/34129 -->
|
||||||
|
A <code>TestMain</code> function is no longer required to call
|
||||||
|
<code>os.Exit</code>. If a <code>TestMain</code> function returns,
|
||||||
|
the test binary will call <code>os.Exit</code> with the value returned
|
||||||
|
by <code>m.Run</code>.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- testing -->
|
||||||
|
|
||||||
|
<h3 id="minor_library_changes">Minor changes to the library</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As always, there are various minor changes and updates to the library,
|
||||||
|
made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
|
||||||
|
in mind.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
TODO
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl id="pkg-runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- CL 221779 -->
|
||||||
|
If <code>panic</code> is invoked with a value whose type is derived from any
|
||||||
|
of: <code>bool</code>, <code>complex64</code>, <code>complex128</code>, <code>float32</code>, <code>float64</code>,
|
||||||
|
<code>int</code>, <code>int8</code>, <code>int16</code>, <code>int32</code>, <code>int64</code>, <code>string</code>,
|
||||||
|
<code>uint</code>, <code>uint8</code>, <code>uint16</code>, <code>uint32</code>, <code>uint64</code>, <code>uintptr</code>,
|
||||||
|
then the value will be printed, instead of just its address.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- golang.org/issue/33762 -->
|
||||||
|
The new method
|
||||||
|
<a href="/pkg/sync#Map.LoadAndDelete"><code>Map.LoadAndDelete</code></a>
|
||||||
|
atomically deletes a key and returns the previous value if present.
|
||||||
|
</p>
|
||||||
|
<p><!-- CL 205899 -->
|
||||||
|
The method
|
||||||
|
<a href="/pkg/sync#Map.Delete"><code>Map.Delete</code></a>
|
||||||
|
is more efficient.
|
||||||
|
</p>
|
||||||
|
</dl><!-- sync -->
|
||||||
|
|
||||||
|
<dl id="time"><dt><a href="/pkg/time/">time</a></dt>
|
||||||
|
<dd>
|
||||||
|
<p><!-- golang.org/issue/33184 -->
|
||||||
|
The new method
|
||||||
|
<a href="/pkg/time#Ticker.Reset"><code>Ticker.Reset</code></a>
|
||||||
|
supports changing the duration of a ticker.
|
||||||
|
</p>
|
||||||
|
</dd>
|
||||||
|
</dl><!-- time -->
|
||||||
|
|
@ -862,7 +862,7 @@ version of gccgo.
|
||||||
|
|
||||||
</dl><!-- reflect -->
|
</dl><!-- reflect -->
|
||||||
|
|
||||||
<dl id="runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
<dl id="pkg-runtime"><dt><a href="/pkg/runtime/">runtime</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<p><!-- CL 37233, CL 37726 -->
|
<p><!-- CL 37233, CL 37726 -->
|
||||||
Tracebacks generated by the runtime and recorded in profiles are
|
Tracebacks generated by the runtime and recorded in profiles are
|
||||||
|
|
|
||||||
|
|
@ -273,9 +273,7 @@ func f() {
|
||||||
a = "hello, world"
|
a = "hello, world"
|
||||||
<-c
|
<-c
|
||||||
}
|
}
|
||||||
</pre>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
func main() {
|
func main() {
|
||||||
go f()
|
go f()
|
||||||
c <- 0
|
c <- 0
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<!--{
|
<!--{
|
||||||
"Title": "The Go Programming Language Specification",
|
"Title": "The Go Programming Language Specification",
|
||||||
"Subtitle": "Version of Sep 4, 2019",
|
"Subtitle": "Version of Jan 14, 2020",
|
||||||
"Path": "/ref/spec"
|
"Path": "/ref/spec"
|
||||||
}-->
|
}-->
|
||||||
|
|
||||||
|
|
@ -20,8 +20,8 @@ dependencies.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The grammar is compact and regular, allowing for easy analysis by
|
The grammar is compact and simple to parse, allowing for easy analysis
|
||||||
automatic tools such as integrated development environments.
|
by automatic tools such as integrated development environments.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="Notation">Notation</h2>
|
<h2 id="Notation">Notation</h2>
|
||||||
|
|
@ -2042,7 +2042,7 @@ of the last non-empty expression list.
|
||||||
<p>
|
<p>
|
||||||
A type declaration binds an identifier, the <i>type name</i>, to a <a href="#Types">type</a>.
|
A type declaration binds an identifier, the <i>type name</i>, to a <a href="#Types">type</a>.
|
||||||
Type declarations come in two forms: alias declarations and type definitions.
|
Type declarations come in two forms: alias declarations and type definitions.
|
||||||
<p>
|
</p>
|
||||||
|
|
||||||
<pre class="ebnf">
|
<pre class="ebnf">
|
||||||
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
|
TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
|
||||||
|
|
@ -2413,7 +2413,7 @@ operand only on the left-hand side of an <a href="#Assignments">assignment</a>.
|
||||||
Operand = Literal | OperandName | "(" Expression ")" .
|
Operand = Literal | OperandName | "(" Expression ")" .
|
||||||
Literal = BasicLit | CompositeLit | FunctionLit .
|
Literal = BasicLit | CompositeLit | FunctionLit .
|
||||||
BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
|
BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
|
||||||
OperandName = identifier | QualifiedIdent.
|
OperandName = identifier | QualifiedIdent .
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3 id="Qualified_identifiers">Qualified identifiers</h3>
|
<h3 id="Qualified_identifiers">Qualified identifiers</h3>
|
||||||
|
|
@ -2553,7 +2553,7 @@ does not have the same effect as allocating a new slice or map value with
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
p1 := &[]int{} // p1 points to an initialized, empty slice with value []int{} and length 0
|
p1 := &[]int{} // p1 points to an initialized, empty slice with value []int{} and length 0
|
||||||
p2 := new([]int) // p2 points to an uninitialized slice with value nil and length 0
|
p2 := new([]int) // p2 points to an uninitialized slice with value nil and length 0
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
@ -3290,8 +3290,8 @@ array with the operand.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
var a [10]int
|
var a [10]int
|
||||||
s1 := a[3:7] // underlying array of s1 is array a; &s1[2] == &a[5]
|
s1 := a[3:7] // underlying array of s1 is array a; &s1[2] == &a[5]
|
||||||
s2 := s1[1:4] // underlying array of s2 is underlying array of s1 which is array a; &s2[1] == &a[5]
|
s2 := s1[1:4] // underlying array of s2 is underlying array of s1 which is array a; &s2[1] == &a[5]
|
||||||
s2[1] = 42 // s2[1] == s1[2] == a[5] == 42; they all refer to the same underlying array element
|
s2[1] = 42 // s2[1] == s1[2] == a[5] == 42; they all refer to the same underlying array element
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
@ -5279,7 +5279,7 @@ for i, s := range a {
|
||||||
}
|
}
|
||||||
|
|
||||||
var key string
|
var key string
|
||||||
var val interface {} // element type of m is assignable to val
|
var val interface{} // element type of m is assignable to val
|
||||||
m := map[string]int{"mon":0, "tue":1, "wed":2, "thu":3, "fri":4, "sat":5, "sun":6}
|
m := map[string]int{"mon":0, "tue":1, "wed":2, "thu":3, "fri":4, "sat":5, "sun":6}
|
||||||
for key, val = range m {
|
for key, val = range m {
|
||||||
h(key, val)
|
h(key, val)
|
||||||
|
|
|
||||||
|
|
@ -106,23 +106,17 @@ Go does not support CentOS 6 on these systems.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2 id="go14">Install Go compiler binaries</h2>
|
<h2 id="go14">Install Go compiler binaries for bootstrap</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The Go toolchain is written in Go. To build it, you need a Go compiler installed.
|
The Go toolchain is written in Go. To build it, you need a Go compiler installed.
|
||||||
The scripts that do the initial build of the tools look for an existing Go tool
|
The scripts that do the initial build of the tools look for a "go" command
|
||||||
chain in <code>$GOROOT_BOOTSTRAP</code>.
|
in <code>$PATH</code>, so as long as you have Go installed in your
|
||||||
If unset, the default value of <code>GOROOT_BOOTSTRAP</code>
|
system and configured in your <code>$PATH</code>, you are ready to build Go
|
||||||
is <code>$HOME/go1.4</code>.
|
from source.
|
||||||
</p>
|
Or if you prefer you can set <code>$GOROOT_BOOTSTRAP</code> to the
|
||||||
|
root of a Go installation to use to build the new Go toolchain;
|
||||||
<p>
|
<code>$GOROOT_BOOTSTRAP/bin/go</code> should be the go command to use.</p>
|
||||||
There are many options for the bootstrap toolchain.
|
|
||||||
After obtaining one, set <code>GOROOT_BOOTSTRAP</code> to the
|
|
||||||
directory containing the unpacked tree.
|
|
||||||
For example, <code>$GOROOT_BOOTSTRAP/bin/go</code> should be
|
|
||||||
the <code>go</code> command binary for the bootstrap toolchain.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3 id="bootstrapFromBinaryRelease">Bootstrap toolchain from binary release</h3>
|
<h3 id="bootstrapFromBinaryRelease">Bootstrap toolchain from binary release</h3>
|
||||||
|
|
||||||
|
|
@ -247,10 +241,12 @@ that if Go is checked out in <code>$HOME/go</code>, it will conflict with
|
||||||
the default location of <code>$GOPATH</code>.
|
the default location of <code>$GOPATH</code>.
|
||||||
See <a href="#gopath"><code>GOPATH</code></a> below.</p>
|
See <a href="#gopath"><code>GOPATH</code></a> below.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
Reminder: If you opted to also compile the bootstrap binaries from source (in an
|
Reminder: If you opted to also compile the bootstrap binaries from source (in an
|
||||||
earlier section), you still need to <code>git clone</code> again at this point
|
earlier section), you still need to <code>git clone</code> again at this point
|
||||||
(to checkout the latest <code><tag></code>), because you must keep your
|
(to checkout the latest <code><tag></code>), because you must keep your
|
||||||
go1.4 repository distinct.
|
go1.4 repository distinct.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="head">(Optional) Switch to the master branch</h2>
|
<h2 id="head">(Optional) Switch to the master branch</h2>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<p>
|
<p>
|
||||||
<a href="/dl/" target="_blank">Official binary
|
<a href="/dl/" target="_blank">Official binary
|
||||||
distributions</a> are available for the FreeBSD (release 10-STABLE and above),
|
distributions</a> are available for the FreeBSD (release 10-STABLE and above),
|
||||||
Linux, macOS (10.10 and above), and Windows operating systems and
|
Linux, macOS (10.11 and above), and Windows operating systems and
|
||||||
the 32-bit (<code>386</code>) and 64-bit (<code>amd64</code>) x86 processor
|
the 32-bit (<code>386</code>) and 64-bit (<code>amd64</code>) x86 processor
|
||||||
architectures.
|
architectures.
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -49,7 +49,7 @@ If your OS or architecture is not on the list, you may be able to
|
||||||
<tr><td colspan="3"><hr></td></tr>
|
<tr><td colspan="3"><hr></td></tr>
|
||||||
<tr><td>FreeBSD 10.3 or later</td> <td>amd64, 386</td> <td>Debian GNU/kFreeBSD not supported</td></tr>
|
<tr><td>FreeBSD 10.3 or later</td> <td>amd64, 386</td> <td>Debian GNU/kFreeBSD not supported</td></tr>
|
||||||
<tr valign='top'><td>Linux 2.6.23 or later with glibc</td> <td>amd64, 386, arm, arm64,<br>s390x, ppc64le</td> <td>CentOS/RHEL 5.x not supported.<br>Install from source for other libc.</td></tr>
|
<tr valign='top'><td>Linux 2.6.23 or later with glibc</td> <td>amd64, 386, arm, arm64,<br>s390x, ppc64le</td> <td>CentOS/RHEL 5.x not supported.<br>Install from source for other libc.</td></tr>
|
||||||
<tr><td>macOS 10.10 or later</td> <td>amd64</td> <td>use the clang or gcc<sup>†</sup> that comes with Xcode<sup>‡</sup> for <code>cgo</code> support</td></tr>
|
<tr><td>macOS 10.11 or later</td> <td>amd64</td> <td>use the clang or gcc<sup>†</sup> that comes with Xcode<sup>‡</sup> for <code>cgo</code> support</td></tr>
|
||||||
<tr valign='top'><td>Windows 7, Server 2008R2 or later</td> <td>amd64, 386</td> <td>use MinGW (<code>386</code>) or MinGW-W64 (<code>amd64</code>) gcc<sup>†</sup>.<br>No need for cygwin or msys.</td></tr>
|
<tr valign='top'><td>Windows 7, Server 2008R2 or later</td> <td>amd64, 386</td> <td>use MinGW (<code>386</code>) or MinGW-W64 (<code>amd64</code>) gcc<sup>†</sup>.<br>No need for cygwin or msys.</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
@ -192,20 +192,11 @@ Settings" option inside the "System" control panel.
|
||||||
<h2 id="testing">Test your installation</h2>
|
<h2 id="testing">Test your installation</h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Check that Go is installed correctly by setting up a workspace
|
Check that Go is installed correctly by building a simple program, as follows.
|
||||||
and building a simple program, as follows.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Create your <a href="code.html#Workspaces">workspace</a> directory,
|
Create a file named <code>hello.go</code> that looks like:
|
||||||
<code class="testUnix">$HOME/go</code><code class="testWindows">%USERPROFILE%\go</code>.
|
|
||||||
(If you'd like to use a different directory,
|
|
||||||
you will need to <a href="https://golang.org/wiki/SettingGOPATH">set the <code>GOPATH</code> environment variable</a>.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Next, make the directory <code class="testUnix">src/hello</code><code class="testWindows">src\hello</code> inside your workspace,
|
|
||||||
and in that directory create a file named <code>hello.go</code> that looks like:
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
|
@ -223,19 +214,17 @@ Then build it with the <code>go</code> tool:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre class="testUnix">
|
<pre class="testUnix">
|
||||||
$ <b>cd $HOME/go/src/hello</b>
|
$ <b>go build hello.go</b>
|
||||||
$ <b>go build</b>
|
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<pre class="testWindows">
|
<pre class="testWindows">
|
||||||
C:\> <b>cd %USERPROFILE%\go\src\hello</b>
|
C:\Users\Gopher\go\src\hello> <b>go build hello.go</b>
|
||||||
C:\Users\Gopher\go\src\hello> <b>go build</b>
|
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The command above will build an executable named
|
The command above will build an executable named
|
||||||
<code class="testUnix">hello</code><code class="testWindows">hello.exe</code>
|
<code class="testUnix">hello</code><code class="testWindows">hello.exe</code>
|
||||||
in the directory alongside your source code.
|
in the current directory alongside your source code.
|
||||||
Execute it to see the greeting:
|
Execute it to see the greeting:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -253,12 +242,6 @@ hello, world
|
||||||
If you see the "hello, world" message then your Go installation is working.
|
If you see the "hello, world" message then your Go installation is working.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
You can run <code>go</code> <code>install</code> to install the binary into
|
|
||||||
your workspace's <code>bin</code> directory
|
|
||||||
or <code>go</code> <code>clean</code> <code>-i</code> to remove it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Before rushing off to write Go code please read the
|
Before rushing off to write Go code please read the
|
||||||
<a href="/doc/code.html">How to Write Go Code</a> document,
|
<a href="/doc/code.html">How to Write Go Code</a> document,
|
||||||
|
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Title": "Go Modules Reference",
|
|
||||||
"Subtitle": "Version of Sep 4, 2019",
|
|
||||||
"Path": "/ref/modules"
|
|
||||||
}-->
|
|
||||||
<!-- TODO(jayconrod): ensure golang.org/x/website can render Markdown or convert
|
|
||||||
this document to HTML before Go 1.14. -->
|
|
||||||
<!-- TODO(jayconrod): ensure Markdown renderer adds anchors or add them
|
|
||||||
manually. -->
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
## Glossary
|
|
||||||
|
|
||||||
## Packages, modules, and versions
|
|
||||||
|
|
||||||
## go.mod files
|
|
||||||
|
|
||||||
### go.mod file format
|
|
||||||
|
|
||||||
### Minimal version selection (MVS)
|
|
||||||
|
|
||||||
### Compatibility with non-module repositories
|
|
||||||
|
|
||||||
## Module-aware build commands
|
|
||||||
|
|
||||||
### Enabling modules
|
|
||||||
|
|
||||||
### Initializing modules
|
|
||||||
|
|
||||||
### Build commands
|
|
||||||
|
|
||||||
### Vendoring
|
|
||||||
|
|
||||||
### `go mod download`
|
|
||||||
|
|
||||||
### `go mod verify`
|
|
||||||
|
|
||||||
### `go mod edit`
|
|
||||||
|
|
||||||
### `go clean -modcache`
|
|
||||||
|
|
||||||
### Module commands outside a module
|
|
||||||
|
|
||||||
## Retrieving modules
|
|
||||||
|
|
||||||
### GOPROXY protocol
|
|
||||||
|
|
||||||
### Module zip requirements
|
|
||||||
|
|
||||||
### Privacy
|
|
||||||
|
|
||||||
### Private modules
|
|
||||||
|
|
||||||
## Authenticating modules
|
|
||||||
|
|
||||||
### go.sum file format
|
|
||||||
|
|
||||||
### Checksum database
|
|
||||||
|
|
||||||
### Privacy
|
|
||||||
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const usage = `go run run.go [tests]
|
const usage = `go run run.go [tests]
|
||||||
|
|
@ -26,6 +27,8 @@ Tests may be specified without their .go suffix.
|
||||||
`
|
`
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintf(os.Stderr, usage)
|
fmt.Fprintf(os.Stderr, usage)
|
||||||
flag.PrintDefaults()
|
flag.PrintDefaults()
|
||||||
|
|
@ -70,6 +73,9 @@ func main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Remove(tmpdir)
|
os.Remove(tmpdir)
|
||||||
|
if rc == 0 {
|
||||||
|
fmt.Printf("ok\t%s\t%s\n", filepath.Base(os.Args[0]), time.Since(start).Round(time.Millisecond))
|
||||||
|
}
|
||||||
os.Exit(rc)
|
os.Exit(rc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,7 +84,7 @@ func main() {
|
||||||
// and checks that the output matches the regexp want.
|
// and checks that the output matches the regexp want.
|
||||||
func test(tmpdir, file, want string) error {
|
func test(tmpdir, file, want string) error {
|
||||||
// Build the program.
|
// Build the program.
|
||||||
prog := filepath.Join(tmpdir, file)
|
prog := filepath.Join(tmpdir, file+".exe")
|
||||||
cmd := exec.Command("go", "build", "-o", prog, file+".go")
|
cmd := exec.Command("go", "build", "-o", prog, file+".go")
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
164
doc/root.html
164
doc/root.html
|
|
@ -1,164 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Path": "/",
|
|
||||||
"Template": true
|
|
||||||
}-->
|
|
||||||
|
|
||||||
<div class="left">
|
|
||||||
|
|
||||||
<div id="learn">
|
|
||||||
{{if not $.GoogleCN}}
|
|
||||||
<a class="popout share">Pop-out</a>
|
|
||||||
{{end}}
|
|
||||||
<div class="rootHeading">Try Go</div>
|
|
||||||
<div class="input">
|
|
||||||
<textarea spellcheck="false" class="code">// You can edit this code!
|
|
||||||
// Click here and start typing.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println("Hello, 世界")
|
|
||||||
}</textarea>
|
|
||||||
</div>
|
|
||||||
<div class="output">
|
|
||||||
<pre>
|
|
||||||
Hello, 世界
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
<div class="buttons">
|
|
||||||
<a class="run" href="#" title="Run this code [shift-enter]">Run</a>
|
|
||||||
{{if not $.GoogleCN}}
|
|
||||||
<a class="share" href="#" title="Share this code">Share</a>
|
|
||||||
<a class="tour" href="//tour.golang.org/" title="Learn Go from your browser">Tour</a>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
<div class="toys">
|
|
||||||
<select>
|
|
||||||
<option value="hello.go">Hello, World!</option>
|
|
||||||
<option value="life.go">Conway's Game of Life</option>
|
|
||||||
<option value="fib.go">Fibonacci Closure</option>
|
|
||||||
<option value="peano.go">Peano Integers</option>
|
|
||||||
<option value="pi.go">Concurrent pi</option>
|
|
||||||
<option value="sieve.go">Concurrent Prime Sieve</option>
|
|
||||||
<option value="solitaire.go">Peg Solitaire Solver</option>
|
|
||||||
<option value="tree.go">Tree Comparison</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="right">
|
|
||||||
|
|
||||||
<div id="about">
|
|
||||||
Go is an open source programming language that makes it easy to build
|
|
||||||
simple, reliable, and efficient software.
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="gopher"></div>
|
|
||||||
|
|
||||||
<a href="/dl/" id="start">
|
|
||||||
<span class="big">Download Go</span>
|
|
||||||
<span class="desc">
|
|
||||||
Binary distributions available for<br>
|
|
||||||
Linux, macOS, Windows, and more.
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="clear: both"></div>
|
|
||||||
|
|
||||||
{{if not $.GoogleCN}}
|
|
||||||
<div class="left">
|
|
||||||
<div id="video">
|
|
||||||
<div class="rootHeading">Featured video</div>
|
|
||||||
<div class="js-frontpage-video" style="--aspect-ratio-padding: 58.07%;"><iframe width="415" height="241" src="//www.youtube.com/embed/ytEkHepK08c" frameborder="0" allowfullscreen></iframe></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="right">
|
|
||||||
<div id="blog">
|
|
||||||
<div class="rootHeading">Featured articles</div>
|
|
||||||
<div class="read"><a href="//blog.golang.org/">Read more</a></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
<div style="clear: both;"></div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
window.initFuncs.push(function() {
|
|
||||||
// Set up playground if enabled.
|
|
||||||
if (window.playground) {
|
|
||||||
window.playground({
|
|
||||||
"codeEl": "#learn .code",
|
|
||||||
"outputEl": "#learn .output",
|
|
||||||
"runEl": "#learn .run",
|
|
||||||
"shareEl": "#learn .share",
|
|
||||||
"shareRedirect": "//play.golang.org/p/",
|
|
||||||
"toysEl": "#learn .toys select"
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$('#learn').hide()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
{{if not $.GoogleCN}}
|
|
||||||
|
|
||||||
function readableTime(t) {
|
|
||||||
var m = ["January", "February", "March", "April", "May", "June", "July",
|
|
||||||
"August", "September", "October", "November", "December"];
|
|
||||||
var p = t.substring(0, t.indexOf("T")).split("-");
|
|
||||||
var d = new Date(p[0], p[1]-1, p[2]);
|
|
||||||
return d.getDate() + " " + m[d.getMonth()] + " " + d.getFullYear();
|
|
||||||
}
|
|
||||||
|
|
||||||
window.feedLoaded = function(result) {
|
|
||||||
var blog = document.getElementById("blog");
|
|
||||||
var read = blog.getElementsByClassName("read")[0];
|
|
||||||
for (var i = 0; i < result.length && i < 2; i++) {
|
|
||||||
var entry = result[i];
|
|
||||||
var title = document.createElement("a");
|
|
||||||
title.className = "title";
|
|
||||||
title.href = entry.Link;
|
|
||||||
title.innerHTML = entry.Title;
|
|
||||||
blog.insertBefore(title, read);
|
|
||||||
var extract = document.createElement("div");
|
|
||||||
extract.className = "extract";
|
|
||||||
extract.innerHTML = entry.Summary;
|
|
||||||
blog.insertBefore(extract, read);
|
|
||||||
var when = document.createElement("div");
|
|
||||||
when.className = "when";
|
|
||||||
when.innerHTML = "Published " + readableTime(entry.Time);
|
|
||||||
blog.insertBefore(when, read);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.initFuncs.push(function() {
|
|
||||||
// Load blog feed.
|
|
||||||
$('<script/>').attr('text', 'text/javascript')
|
|
||||||
.attr('src', '//blog.golang.org/.json?jsonp=feedLoaded')
|
|
||||||
.appendTo('body');
|
|
||||||
|
|
||||||
// Set the video at random.
|
|
||||||
var videos = [
|
|
||||||
{h: 241, s: "//www.youtube.com/embed/ytEkHepK08c"}, // Tour of Go
|
|
||||||
{h: 241, s: "//www.youtube.com/embed/f6kdp27TYZs"}, // Concurrency Patterns
|
|
||||||
{h: 233, s: "//player.vimeo.com/video/69237265"} // Simple environment
|
|
||||||
];
|
|
||||||
var v = videos[Math.floor(Math.random()*videos.length)];
|
|
||||||
$('#video iframe').attr('height', v.h).attr('src', v.s);
|
|
||||||
// Compute the aspect ratio (as a percentage) of the video
|
|
||||||
// using the fixed width 415 and the height of the current video, v.h.
|
|
||||||
var ar = 100*v.h/415;
|
|
||||||
$('.js-frontpage-video').attr('style', '--aspect-ratio-padding: ' + ar + '%;');
|
|
||||||
});
|
|
||||||
|
|
||||||
{{end}}
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
@ -1,184 +0,0 @@
|
||||||
<!--{
|
|
||||||
"Title": "Go Security Policy",
|
|
||||||
"Path": "/security",
|
|
||||||
"Template": true
|
|
||||||
}-->
|
|
||||||
|
|
||||||
<h2>Implementation</h2>
|
|
||||||
|
|
||||||
<h3>Reporting a Security Bug</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Please report to us any issues you find.
|
|
||||||
This document explains how to do that and what to expect in return.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
All security bugs in the Go distribution should be reported by email to
|
|
||||||
<a href="mailto:security@golang.org">security@golang.org</a>.
|
|
||||||
This mail is delivered to a small security team.
|
|
||||||
Your email will be acknowledged within 24 hours, and you'll receive a more
|
|
||||||
detailed response to your email within 72 hours indicating the next steps in
|
|
||||||
handling your report.
|
|
||||||
For critical problems, you can encrypt your report using our PGP key (listed below).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To ensure your report is not marked as spam, please include the word "vulnerability"
|
|
||||||
anywhere in your email. Please use a descriptive subject line for your report email.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
After the initial reply to your report, the security team will endeavor to keep
|
|
||||||
you informed of the progress being made towards a fix and full announcement.
|
|
||||||
These updates will be sent at least every five days.
|
|
||||||
In reality, this is more likely to be every 24-48 hours.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you have not received a reply to your email within 48 hours or you have not
|
|
||||||
heard from the security team for the past five days please contact the Go
|
|
||||||
security team directly:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Primary security coordinator: <a href="mailto:filippo@golang.org">Filippo Valsorda</a> (<a href="https://keybase.io/filippo/pgp_keys.asc">public key</a>).</li>
|
|
||||||
<li>Secondary coordinator: <a href="mailto:agl@golang.org">Adam Langley</a> (<a href="https://www.imperialviolet.org/key.asc">public key</a>).</li>
|
|
||||||
<li>If you receive no response, mail <a href="mailto:golang-dev@googlegroups.com">golang-dev@googlegroups.com</a> or use the <a href="https://groups.google.com/forum/#!forum/golang-dev">golang-dev web interface</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Please note that golang-dev is a public discussion forum.
|
|
||||||
When escalating on this list, please do not disclose the details of the issue.
|
|
||||||
Simply state that you're trying to reach a member of the security team.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>Flagging Existing Issues as Security-related</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you believe that an <a href="https://golang.org/issue">existing issue</a>
|
|
||||||
is security-related, we ask that you send an email to
|
|
||||||
<a href="mailto:security@golang.org">security@golang.org</a>.
|
|
||||||
The email should include the issue ID and a short description of why it should
|
|
||||||
be handled according to this security policy.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>Disclosure Process</h3>
|
|
||||||
|
|
||||||
<p>The Go project uses the following disclosure process:</p>
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>Once the security report is received it is assigned a primary handler.
|
|
||||||
This person coordinates the fix and release process.</li>
|
|
||||||
<li>The issue is confirmed and a list of affected software is determined.</li>
|
|
||||||
<li>Code is audited to find any potential similar problems.</li>
|
|
||||||
<li>If it is determined, in consultation with the submitter, that a CVE-ID is
|
|
||||||
required, the primary handler obtains one via email to
|
|
||||||
<a href="https://oss-security.openwall.org/wiki/mailing-lists/distros">oss-distros</a>.</li>
|
|
||||||
<li>Fixes are prepared for the two most recent major releases and the head/master
|
|
||||||
revision. These fixes are not yet committed to the public repository.</li>
|
|
||||||
<li>A notification is sent to the
|
|
||||||
<a href="https://groups.google.com/group/golang-announce">golang-announce</a>
|
|
||||||
mailing list to give users time to prepare their systems for the update.</li>
|
|
||||||
<li>Three working days following this notification, the fixes are applied to
|
|
||||||
the <a href="https://go.googlesource.com/go">public repository</a> and a new
|
|
||||||
Go release is issued.</li>
|
|
||||||
<li>On the date that the fixes are applied, announcements are sent to
|
|
||||||
<a href="https://groups.google.com/group/golang-announce">golang-announce</a>,
|
|
||||||
<a href="https://groups.google.com/group/golang-dev">golang-dev</a>, and
|
|
||||||
<a href="https://groups.google.com/group/golang-nuts">golang-nuts</a>.
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This process can take some time, especially when coordination is required with
|
|
||||||
maintainers of other projects. Every effort will be made to handle the bug in
|
|
||||||
as timely a manner as possible, however it's important that we follow the
|
|
||||||
process described above to ensure that disclosures are handled consistently.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For security issues that include the assignment of a CVE-ID,
|
|
||||||
the issue is listed publicly under the
|
|
||||||
<a href="https://www.cvedetails.com/vulnerability-list/vendor_id-14185/Golang.html">"Golang" product on the CVEDetails website</a>
|
|
||||||
as well as the
|
|
||||||
<a href="https://web.nvd.nist.gov/view/vuln/search">National Vulnerability Disclosure site</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>Receiving Security Updates</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The best way to receive security announcements is to subscribe to the
|
|
||||||
<a href="https://groups.google.com/forum/#!forum/golang-announce">golang-announce</a>
|
|
||||||
mailing list. Any messages pertaining to a security issue will be prefixed
|
|
||||||
with <code>[security]</code>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>Comments on This Policy</h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If you have any suggestions to improve this policy, please send an email to
|
|
||||||
<a href="mailto:golang-dev@golang.org">golang-dev@golang.org</a> for discussion.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>PGP Key for <a href="mailto:security@golang.org">security@golang.org</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We accept PGP-encrypted email, but the majority of the security team
|
|
||||||
are not regular PGP users so it's somewhat inconvenient. Please only
|
|
||||||
use PGP for critical security reports.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
Comment: GPGTools - https://gpgtools.org
|
|
||||||
|
|
||||||
mQINBFXI1h0BEADZdm05GDFWvjmQKutUVb0cJKS+VR+6XU3g/YQZGC8tnIL6i7te
|
|
||||||
+fPJHfQc2uIw0xeBgZX4Ni/S8yIqsbIjqYeaToX7QFUufJDQwrmlQRDVAvvT5HBT
|
|
||||||
J80JEs7yHRreFoLzB6dnWehWXzWle4gFKeIy+hvLrYquZVvbeEYTnX7fNzZg0+5L
|
|
||||||
ksvj7lnQlJIy1l3sL/7uPr9qsm45/hzd0WjTQS85Ry6Na3tMwRpqGENDh25Blz75
|
|
||||||
8JgK9JmtTJa00my1zzeCXU04CKKEMRbkMLozzudOH4ZLiLWcFiKRpeCn860wC8l3
|
|
||||||
oJcyyObuTSbr9o05ra3On+epjCEFkknGX1WxPv+TV34i0a23AtuVyTCloKb7RYXc
|
|
||||||
7mUaskZpU2rFBqIkzZ4MQJ7RDtGlm5oBy36j2QL63jAZ1cKoT/yvjJNp2ObmWaVF
|
|
||||||
X3tk/nYw2H0YDjTkTCgGtyAOj3Cfqrtsa5L0jG5K2p4RY8mtVgQ5EOh7QxuS+rmN
|
|
||||||
JiA39SWh7O6uFCwkz/OCXzqeh6/nP10HAb9S9IC34QQxm7Fhd0ZXzEv9IlBTIRzk
|
|
||||||
xddSdACPnLE1gJcFHxBd2LTqS/lmAFShCsf8S252kagKJfHRebQJZHCIs6kT9PfE
|
|
||||||
0muq6KRKeDXv01afAUvoB4QW/3chUrtgL2HryyO8ugMu7leVGmoZhFkIrQARAQAB
|
|
||||||
tCZHbyBTZWN1cml0eSBUZWFtIDxzZWN1cml0eUBnb2xhbmcub3JnPokCPQQTAQoA
|
|
||||||
JwUCVcjWHQIbAwUJB4YfgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRA6RtGR
|
|
||||||
eVpYOLnDD/9YVTd6DTwdJq6irVfM/ICPlPTXB0JLERqCI1Veptcp56eQoJ0XWGQp
|
|
||||||
tkGlgbvmCzFo0B+65Te7YA4R3oyBCXd6JgyWQQPy5p60FHyuuCPVAReclSWyt9f2
|
|
||||||
Yj/u4DjghKhELOvPiI96egcU3g9jrEEcPjm7JYkc9M2gVSNOnnJvcD7wpQJNCzon
|
|
||||||
51eMZ1ZyfA5UCBTa0SaT9eXg5zwNlYQnB6ZF6TjXezkhLqlTsBuHxoNVf+9vCC0o
|
|
||||||
ZKIM2ovptMx9eEguTDKWaQ7tero7Zs/q5fwk/MDzM/LGJ9aXy2RCtqBxv46vDS7G
|
|
||||||
fCNq+aPD/wyFd6hxQkvkua6hgZwYT+cJWHYA2Yv0LO3BYOJdjfc+j2hjv+mC9lF0
|
|
||||||
UpWhCVJv3hHoFaxnz62GdROzf2wXz6aR9Saj1rYSvqT9jC20VInxqMufXNN2sbpo
|
|
||||||
Kyk6MTbAeepphQpfAWQv+ltWgBiEjuFxYdwv/vmw20996JV7O8nqkeCUW84B6su+
|
|
||||||
Y3bbdP9o3DBtOT0j9LTB/FucmdNCNHoO+EnNBKJd6FoYTGLWi3Rq9DLx2V9tdJHo
|
|
||||||
Bn67dymcl+iyp337HJNY+qS+KCgoqAWlxkzXRiXKb/yluhXdIkqhg4kL8JPAJvfS
|
|
||||||
cs7Zn67Mx04ixJnRMYCDmxtD4xPsFMzM7g8m3PQp+nE7WhujM/ImM7kCDQRVyNYd
|
|
||||||
ARAAlw9H/1ybQs4K3XKA1joII16rta9KS7ew76+agXo0jeSRwMEQfItOxYvfhmo8
|
|
||||||
+ydn5TWsTbifGU8L3+EBTMRRyzWhbaGO0Wizw7BTVJ7n5JW+ndPrcUpp/ilUk6AU
|
|
||||||
VxaO/8/R+9+VJZpoeoLHXYloFGNuX58GLIy1jSBvLsLl/Ki5IOrHvD1GK6TftOl5
|
|
||||||
j8IPC1LSBrwGJO803x7wUdQP/tsKN/QPR8pnBntrEgrQFSI+Q3qrCvVMmXnBlYum
|
|
||||||
jfOBt8pKMgB9/ix+HWN8piQNQiJxD+XjEM6XwUmQqIR7y5GINKWgundCmtYIzVgY
|
|
||||||
9p2Br6UPrTJi12LfKv5s2R6NnxFHv/ad29CpPTeLJRsSqFfqBL969BCpj/isXmQE
|
|
||||||
m4FtziZidARXo12KiGAnPF9otirNHp4+8hwNB3scf7cI53y8nZivO9cwI7BoClY6
|
|
||||||
ZIabjDcJxjK+24emoz3mJ5SHpZpQLSb9o8GbLLfXOq+4uzEX2A30fhrtsQb/x0GM
|
|
||||||
4v3EU1aP2mjuksyYbgldtY64tD35wqAA9mVl5Ux+g1HoUBvLw0h+lzwh370NJw//
|
|
||||||
ITvBQVUtDMB96rfIP4fL5pYl5pmRz+vsuJ0iXzm05qBgKfSqO7To9SWxQPdX89R4
|
|
||||||
u0/XVAlw0Ak9Zceq3W96vseEUTR3aoZCMIPiwfcDaq60rWUAEQEAAYkCJQQYAQoA
|
|
||||||
DwUCVcjWHQIbDAUJB4YfgAAKCRA6RtGReVpYOEg/EADZcIYw4q1jAbDkDy3LQG07
|
|
||||||
AR8QmLp/RDp72RKbCSIYyvyXEnmrhUg98lUG676qTH+Y7dlEX107dLhFuKEYyV8D
|
|
||||||
ZalrFQO/3WpLWdIAmWrj/wq14qii1rgmy96Nh3EqG3CS50HEMGkW1llRx2rgBvGl
|
|
||||||
pgoTcwOfT+h8s0HlZdIS/cv2wXqwPgMWr1PIk3as1fu1OH8n/BjeGQQnNJEaoBV7
|
|
||||||
El2C/hz3oqf2uYQ1QvpU23F1NrstekxukO8o2Y/fqsgMJqAiNJApUCl/dNhK+W57
|
|
||||||
iicjvPirUQk8MUVEHXKhWIzYxon6aEUTx+xyNMBpRJIZlJ61FxtnZhoPiAFtXVPb
|
|
||||||
+95BRJA9npidlVFjqz9QDK/4NSnJ3KaERR9tTDcvq4zqT22Z1Ai5gWQKqogTz5Mk
|
|
||||||
F+nZwVizW0yi33id9qDpAuApp8o6AiyH5Ql1Bo23bvqS2lMrXPIS/QmPPsA76CBs
|
|
||||||
lYjQwwz8abUD1pPdzyYtMKZUMwhicSFOHFDM4oQN16k2KJuntuih8BKVDCzIOq+E
|
|
||||||
KHyeh1BqWplUtFh1ckxZlXW9p9F7TsWjtfcKaY8hkX0Cr4uVjwAFIjLcAxk67ROe
|
|
||||||
huEb3Gt+lwJz6aNnZUU87ukMAxRVR2LL0btdxgc6z8spl66GXro/LUkXmAdyOEMV
|
|
||||||
UDrmjf9pr7o00hC7lCHFzw==
|
|
||||||
=WE0r
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
</pre>
|
|
||||||
|
|
@ -8,8 +8,8 @@
|
||||||
# Consult https://www.iana.org/time-zones for the latest versions.
|
# Consult https://www.iana.org/time-zones for the latest versions.
|
||||||
|
|
||||||
# Versions to use.
|
# Versions to use.
|
||||||
CODE=2019b
|
CODE=2019c
|
||||||
DATA=2019b
|
DATA=2019c
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
rm -rf work
|
rm -rf work
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -28,7 +28,7 @@ case "$FC" in
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if ! $FC helloworld/helloworld.f90 -o main.exe >& /dev/null; then
|
if ! $FC helloworld/helloworld.f90 -o /dev/null >& /dev/null; then
|
||||||
echo "skipping Fortran test: could not build helloworld.f90 with $FC"
|
echo "skipping Fortran test: could not build helloworld.f90 with $FC"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// We skip this test in race mode because, for unknown reasons,
|
// +build darwin,cgo,!internal
|
||||||
// linking against CoreFoundation on macOS 10.10 causes mmap to ignore
|
|
||||||
// the hint address, which makes the Go allocator incompatible with
|
|
||||||
// TSAN. See golang.org/issue/26475.
|
|
||||||
//
|
|
||||||
// TODO(austin): Once support for macOS 10.10 is dropped, remove the
|
|
||||||
// race constraint (and the one in issue21897b.go). See
|
|
||||||
// golang.org/issue/26513.
|
|
||||||
|
|
||||||
// +build darwin,cgo,!internal,!race
|
|
||||||
|
|
||||||
package cgotest
|
package cgotest
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// +build !darwin !cgo internal race
|
// +build !darwin !cgo internal
|
||||||
|
|
||||||
package cgotest
|
package cgotest
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build gccgo
|
|
||||||
|
|
||||||
package cgotest
|
|
||||||
|
|
||||||
//typedef void (*PFunc)();
|
|
||||||
//PFunc success_cb;
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
//export Test
|
|
||||||
func Test() {
|
|
||||||
_ = C.success_cb
|
|
||||||
}
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,22 @@ package cgotest
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef _AIX
|
||||||
|
// On AIX, SIGSTKSZ is too small to handle Go sighandler.
|
||||||
|
#define CSIGSTKSZ 0x4000
|
||||||
|
#else
|
||||||
|
#define CSIGSTKSZ SIGSTKSZ
|
||||||
|
#endif
|
||||||
|
|
||||||
static stack_t oss;
|
static stack_t oss;
|
||||||
static char signalStack[SIGSTKSZ];
|
static char signalStack[CSIGSTKSZ];
|
||||||
|
|
||||||
static void changeSignalStack(void) {
|
static void changeSignalStack(void) {
|
||||||
stack_t ss;
|
stack_t ss;
|
||||||
memset(&ss, 0, sizeof ss);
|
memset(&ss, 0, sizeof ss);
|
||||||
ss.ss_sp = signalStack;
|
ss.ss_sp = signalStack;
|
||||||
ss.ss_flags = 0;
|
ss.ss_flags = 0;
|
||||||
ss.ss_size = SIGSTKSZ;
|
ss.ss_size = CSIGSTKSZ;
|
||||||
if (sigaltstack(&ss, &oss) < 0) {
|
if (sigaltstack(&ss, &oss) < 0) {
|
||||||
perror("sigaltstack");
|
perror("sigaltstack");
|
||||||
abort();
|
abort();
|
||||||
|
|
|
||||||
|
|
@ -562,6 +562,11 @@ void issue8811Execute() {
|
||||||
issue8811Init();
|
issue8811Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// issue 8945
|
||||||
|
|
||||||
|
typedef void (*PFunc8945)();
|
||||||
|
PFunc8945 func8945;
|
||||||
|
|
||||||
// issue 9557
|
// issue 9557
|
||||||
|
|
||||||
struct issue9557_t {
|
struct issue9557_t {
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,6 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// See issue21897.go and golang.org/issue/26475 for why this is
|
|
||||||
// skipped in race mode.
|
|
||||||
//
|
|
||||||
// TODO(austin): Once support for macOS 10.10 is dropped, remove the
|
|
||||||
// race constraint. See golang.org/issue/26513.
|
|
||||||
|
|
||||||
// +build !race
|
|
||||||
|
|
||||||
package cgotest
|
package cgotest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
2
misc/cgo/test/testdata/issue24161e0/main.go
vendored
2
misc/cgo/test/testdata/issue24161e0/main.go
vendored
|
|
@ -12,7 +12,7 @@ package issue24161e0
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <Security/Security.h>
|
#include <Security/Security.h>
|
||||||
#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
|
#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
|
||||||
typedef CFStringRef SecKeyAlgorithm;
|
typedef CFStringRef SecKeyAlgorithm;
|
||||||
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
||||||
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
||||||
|
|
|
||||||
2
misc/cgo/test/testdata/issue24161e1/main.go
vendored
2
misc/cgo/test/testdata/issue24161e1/main.go
vendored
|
|
@ -12,7 +12,7 @@ package issue24161e1
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <Security/Security.h>
|
#include <Security/Security.h>
|
||||||
#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
|
#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
|
||||||
typedef CFStringRef SecKeyAlgorithm;
|
typedef CFStringRef SecKeyAlgorithm;
|
||||||
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
||||||
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
||||||
|
|
|
||||||
2
misc/cgo/test/testdata/issue24161e2/main.go
vendored
2
misc/cgo/test/testdata/issue24161e2/main.go
vendored
|
|
@ -12,7 +12,7 @@ package issue24161e2
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <Security/Security.h>
|
#include <Security/Security.h>
|
||||||
#if TARGET_OS_IPHONE == 0 && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200
|
#if TARGET_OS_IPHONE == 0 && __MAC_OS_X_VERSION_MAX_ALLOWED < 101200
|
||||||
typedef CFStringRef SecKeyAlgorithm;
|
typedef CFStringRef SecKeyAlgorithm;
|
||||||
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
static CFDataRef SecKeyCreateSignature(SecKeyRef key, SecKeyAlgorithm algorithm, CFDataRef dataToSign, CFErrorRef *error){return NULL;}
|
||||||
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
#define kSecKeyAlgorithmECDSASignatureDigestX962SHA1 foo()
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ package issue9026
|
||||||
// per-package counter used to create fresh identifiers.
|
// per-package counter used to create fresh identifiers.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
typedef struct {} git_merge_file_input;
|
typedef struct { int i; } git_merge_file_input;
|
||||||
|
|
||||||
typedef struct {} git_merge_file_options;
|
typedef struct { int j; } git_merge_file_options;
|
||||||
|
|
||||||
void git_merge_file(
|
void git_merge_file(
|
||||||
git_merge_file_input *in,
|
git_merge_file_input *in,
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,11 @@ static void issue7978c(uint32_t *sync) {
|
||||||
// #include'd twice. No runtime test; just make sure it compiles.
|
// #include'd twice. No runtime test; just make sure it compiles.
|
||||||
#include "issue8331.h"
|
#include "issue8331.h"
|
||||||
|
|
||||||
|
// issue 8945
|
||||||
|
|
||||||
|
typedef void (*PFunc8945)();
|
||||||
|
extern PFunc8945 func8945; // definition is in test.go
|
||||||
|
|
||||||
// issue 20910
|
// issue 20910
|
||||||
void callMulti(void);
|
void callMulti(void);
|
||||||
|
|
||||||
|
|
@ -514,6 +519,13 @@ func test7978(t *testing.T) {
|
||||||
|
|
||||||
var issue8331Var C.issue8331
|
var issue8331Var C.issue8331
|
||||||
|
|
||||||
|
// issue 8945
|
||||||
|
|
||||||
|
//export Test8945
|
||||||
|
func Test8945() {
|
||||||
|
_ = C.func8945
|
||||||
|
}
|
||||||
|
|
||||||
// issue 20910
|
// issue 20910
|
||||||
|
|
||||||
//export multi
|
//export multi
|
||||||
|
|
|
||||||
|
|
@ -36,14 +36,21 @@ thread(void *p)
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
// ensure that we can function normally
|
// ensure that we can function normally
|
||||||
var v [][]byte
|
var v [][]byte
|
||||||
for i := 0; i < 1000; i++ {
|
for i := 0; i < 1000; i++ {
|
||||||
time.Sleep(10 * time.Microsecond)
|
time.Sleep(10 * time.Microsecond)
|
||||||
v = append(v, make([]byte, 64<<10))
|
v = append(v, make([]byte, 64<<10))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Printf("ok\t%s\t%s\n", filepath.Base(os.Args[0]), time.Since(start).Round(time.Millisecond))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,10 @@ var exeSuffix string
|
||||||
var GOOS, GOARCH, GOPATH string
|
var GOOS, GOARCH, GOPATH string
|
||||||
var libgodir string
|
var libgodir string
|
||||||
|
|
||||||
|
var testWork bool // If true, preserve temporary directories.
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
|
flag.BoolVar(&testWork, "testwork", false, "if true, log and preserve the test's temporary working directory")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
|
if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
|
||||||
fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
|
fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
|
||||||
|
|
@ -54,7 +57,11 @@ func testMain(m *testing.M) int {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
}
|
}
|
||||||
defer os.RemoveAll(GOPATH)
|
if testWork {
|
||||||
|
log.Println(GOPATH)
|
||||||
|
} else {
|
||||||
|
defer os.RemoveAll(GOPATH)
|
||||||
|
}
|
||||||
os.Setenv("GOPATH", GOPATH)
|
os.Setenv("GOPATH", GOPATH)
|
||||||
|
|
||||||
// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
|
// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
|
||||||
|
|
@ -164,6 +171,38 @@ func cmdToRun(name string) []string {
|
||||||
return []string{executor, name}
|
return []string{executor, name}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// genHeader writes a C header file for the C-exported declarations found in .go
|
||||||
|
// source files in dir.
|
||||||
|
//
|
||||||
|
// TODO(golang.org/issue/35715): This should be simpler.
|
||||||
|
func genHeader(t *testing.T, header, dir string) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
// The 'cgo' command generates a number of additional artifacts,
|
||||||
|
// but we're only interested in the header.
|
||||||
|
// Shunt the rest of the outputs to a temporary directory.
|
||||||
|
objDir, err := ioutil.TempDir(GOPATH, "_obj")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(objDir)
|
||||||
|
|
||||||
|
files, err := filepath.Glob(filepath.Join(dir, "*.go"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "tool", "cgo",
|
||||||
|
"-objdir", objDir,
|
||||||
|
"-exportheader", header)
|
||||||
|
cmd.Args = append(cmd.Args, files...)
|
||||||
|
t.Log(cmd.Args)
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
t.Logf("%s", out)
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
|
func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
||||||
|
|
@ -172,10 +211,12 @@ func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
|
||||||
t.Logf("%s", out)
|
t.Logf("%s", out)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove(libgoa)
|
defer func() {
|
||||||
os.Remove(libgoh)
|
os.Remove(libgoa)
|
||||||
}()
|
os.Remove(libgoh)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
ccArgs := append(cc, "-o", exe, "main.c")
|
ccArgs := append(cc, "-o", exe, "main.c")
|
||||||
if GOOS == "windows" {
|
if GOOS == "windows" {
|
||||||
|
|
@ -191,7 +232,9 @@ func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
|
||||||
t.Logf("%s", out)
|
t.Logf("%s", out)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer os.Remove(exe)
|
if !testWork {
|
||||||
|
defer os.Remove(exe)
|
||||||
|
}
|
||||||
|
|
||||||
binArgs := append(cmdToRun(exe), "arg1", "arg2")
|
binArgs := append(cmdToRun(exe), "arg1", "arg2")
|
||||||
cmd = exec.Command(binArgs[0], binArgs[1:]...)
|
cmd = exec.Command(binArgs[0], binArgs[1:]...)
|
||||||
|
|
@ -227,17 +270,27 @@ func checkLineComments(t *testing.T, hdrname string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInstall(t *testing.T) {
|
func TestInstall(t *testing.T) {
|
||||||
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
if !testWork {
|
||||||
|
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}
|
||||||
|
|
||||||
libgoa := "libgo.a"
|
libgoa := "libgo.a"
|
||||||
if runtime.Compiler == "gccgo" {
|
if runtime.Compiler == "gccgo" {
|
||||||
libgoa = "liblibgo.a"
|
libgoa = "liblibgo.a"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate the p.h header file.
|
||||||
|
//
|
||||||
|
// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
|
||||||
|
// would also attempt to install transitive standard-library dependencies to
|
||||||
|
// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
|
||||||
|
// be running this test in a GOROOT owned by root.)
|
||||||
|
genHeader(t, "p.h", "./p")
|
||||||
|
|
||||||
testInstall(t, "./testp1"+exeSuffix,
|
testInstall(t, "./testp1"+exeSuffix,
|
||||||
filepath.Join(libgodir, libgoa),
|
filepath.Join(libgodir, libgoa),
|
||||||
filepath.Join(libgodir, "libgo.h"),
|
filepath.Join(libgodir, "libgo.h"),
|
||||||
"go", "install", "-i", "-buildmode=c-archive", "./libgo")
|
"go", "install", "-buildmode=c-archive", "./libgo")
|
||||||
|
|
||||||
// Test building libgo other than installing it.
|
// Test building libgo other than installing it.
|
||||||
// Header files are now present.
|
// Header files are now present.
|
||||||
|
|
@ -259,12 +312,14 @@ func TestEarlySignalHandler(t *testing.T) {
|
||||||
t.Skip("skipping signal test on Windows")
|
t.Skip("skipping signal test on Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo2.a")
|
defer func() {
|
||||||
os.Remove("libgo2.h")
|
os.Remove("libgo2.a")
|
||||||
os.Remove("testp")
|
os.Remove("libgo2.h")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -297,12 +352,14 @@ func TestEarlySignalHandler(t *testing.T) {
|
||||||
func TestSignalForwarding(t *testing.T) {
|
func TestSignalForwarding(t *testing.T) {
|
||||||
checkSignalForwardingTest(t)
|
checkSignalForwardingTest(t)
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo2.a")
|
defer func() {
|
||||||
os.Remove("libgo2.h")
|
os.Remove("libgo2.a")
|
||||||
os.Remove("testp")
|
os.Remove("libgo2.h")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -345,12 +402,14 @@ func TestSignalForwardingExternal(t *testing.T) {
|
||||||
}
|
}
|
||||||
checkSignalForwardingTest(t)
|
checkSignalForwardingTest(t)
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo2.a")
|
defer func() {
|
||||||
os.Remove("libgo2.h")
|
os.Remove("libgo2.a")
|
||||||
os.Remove("testp")
|
os.Remove("libgo2.h")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -460,12 +519,14 @@ func TestOsSignal(t *testing.T) {
|
||||||
t.Skip("skipping signal test on Windows")
|
t.Skip("skipping signal test on Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo3.a")
|
defer func() {
|
||||||
os.Remove("libgo3.h")
|
os.Remove("libgo3.a")
|
||||||
os.Remove("testp")
|
os.Remove("libgo3.h")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -495,12 +556,14 @@ func TestSigaltstack(t *testing.T) {
|
||||||
t.Skip("skipping signal test on Windows")
|
t.Skip("skipping signal test on Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo4.a")
|
defer func() {
|
||||||
os.Remove("libgo4.h")
|
os.Remove("libgo4.a")
|
||||||
os.Remove("testp")
|
os.Remove("libgo4.h")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -544,13 +607,15 @@ func TestExtar(t *testing.T) {
|
||||||
t.Skip("shell scripts are not executable on iOS hosts")
|
t.Skip("shell scripts are not executable on iOS hosts")
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo4.a")
|
defer func() {
|
||||||
os.Remove("libgo4.h")
|
os.Remove("libgo4.a")
|
||||||
os.Remove("testar")
|
os.Remove("libgo4.h")
|
||||||
os.Remove("testar.ran")
|
os.Remove("testar")
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testar.ran")
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
os.Remove("testar")
|
os.Remove("testar")
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
|
|
@ -584,12 +649,22 @@ func TestPIE(t *testing.T) {
|
||||||
t.Skipf("skipping PIE test on %s", GOOS)
|
t.Skipf("skipping PIE test on %s", GOOS)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("testp" + exeSuffix)
|
defer func() {
|
||||||
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
os.Remove("testp" + exeSuffix)
|
||||||
}()
|
os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "./libgo")
|
// Generate the p.h header file.
|
||||||
|
//
|
||||||
|
// 'go install -i -buildmode=c-archive ./libgo' would do that too, but that
|
||||||
|
// would also attempt to install transitive standard-library dependencies to
|
||||||
|
// GOROOT, and we cannot assume that GOROOT is writable. (A non-root user may
|
||||||
|
// be running this test in a GOROOT owned by root.)
|
||||||
|
genHeader(t, "p.h", "./p")
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "install", "-buildmode=c-archive", "./libgo")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
t.Logf("%s", out)
|
t.Logf("%s", out)
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
@ -669,11 +744,13 @@ func TestSIGPROF(t *testing.T) {
|
||||||
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("testp6" + exeSuffix)
|
defer func() {
|
||||||
os.Remove("libgo6.a")
|
os.Remove("testp6" + exeSuffix)
|
||||||
os.Remove("libgo6.h")
|
os.Remove("libgo6.a")
|
||||||
}()
|
os.Remove("libgo6.h")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
@ -709,10 +786,12 @@ func TestCompileWithoutShared(t *testing.T) {
|
||||||
// For simplicity, reuse the signal forwarding test.
|
// For simplicity, reuse the signal forwarding test.
|
||||||
checkSignalForwardingTest(t)
|
checkSignalForwardingTest(t)
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("libgo2.a")
|
defer func() {
|
||||||
os.Remove("libgo2.h")
|
os.Remove("libgo2.a")
|
||||||
}()
|
os.Remove("libgo2.h")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
|
||||||
t.Log(cmd.Args)
|
t.Log(cmd.Args)
|
||||||
|
|
@ -751,7 +830,9 @@ func TestCompileWithoutShared(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer os.Remove(exe)
|
if !testWork {
|
||||||
|
defer os.Remove(exe)
|
||||||
|
}
|
||||||
|
|
||||||
binArgs := append(cmdToRun(exe), "1")
|
binArgs := append(cmdToRun(exe), "1")
|
||||||
t.Log(binArgs)
|
t.Log(binArgs)
|
||||||
|
|
@ -769,14 +850,15 @@ func TestCompileWithoutShared(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that installing a second time recreates the header files.
|
// Test that installing a second time recreates the header file.
|
||||||
func TestCachedInstall(t *testing.T) {
|
func TestCachedInstall(t *testing.T) {
|
||||||
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
if !testWork {
|
||||||
|
defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
|
||||||
|
}
|
||||||
|
|
||||||
h1 := filepath.Join(libgodir, "libgo.h")
|
h := filepath.Join(libgodir, "libgo.h")
|
||||||
h2 := filepath.Join(libgodir, "p.h")
|
|
||||||
|
|
||||||
buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "./libgo"}
|
buildcmd := []string{"go", "install", "-buildmode=c-archive", "./libgo"}
|
||||||
|
|
||||||
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
||||||
t.Log(buildcmd)
|
t.Log(buildcmd)
|
||||||
|
|
@ -785,17 +867,11 @@ func TestCachedInstall(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(h1); err != nil {
|
if _, err := os.Stat(h); err != nil {
|
||||||
t.Errorf("libgo.h not installed: %v", err)
|
t.Errorf("libgo.h not installed: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(h2); err != nil {
|
|
||||||
t.Errorf("p.h not installed: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Remove(h1); err != nil {
|
if err := os.Remove(h); err != nil {
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := os.Remove(h2); err != nil {
|
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -806,23 +882,22 @@ func TestCachedInstall(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(h1); err != nil {
|
if _, err := os.Stat(h); err != nil {
|
||||||
t.Errorf("libgo.h not installed in second run: %v", err)
|
t.Errorf("libgo.h not installed in second run: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(h2); err != nil {
|
|
||||||
t.Errorf("p.h not installed in second run: %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Issue 35294.
|
// Issue 35294.
|
||||||
func TestManyCalls(t *testing.T) {
|
func TestManyCalls(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
defer func() {
|
if !testWork {
|
||||||
os.Remove("testp7" + exeSuffix)
|
defer func() {
|
||||||
os.Remove("libgo7.a")
|
os.Remove("testp7" + exeSuffix)
|
||||||
os.Remove("libgo7.h")
|
os.Remove("libgo7.a")
|
||||||
}()
|
os.Remove("libgo7.h")
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo7.a", "./libgo7")
|
cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo7.a", "./libgo7")
|
||||||
if out, err := cmd.CombinedOutput(); err != nil {
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,7 @@ func testMain(m *testing.M) int {
|
||||||
// TODO(crawshaw): can we do better?
|
// TODO(crawshaw): can we do better?
|
||||||
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
|
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
|
||||||
case "android":
|
case "android":
|
||||||
cc = append(cc, "-pie", "-fuse-ld=gold")
|
cc = append(cc, "-pie")
|
||||||
}
|
}
|
||||||
libgodir := GOOS + "_" + GOARCH
|
libgodir := GOOS + "_" + GOARCH
|
||||||
switch GOOS {
|
switch GOOS {
|
||||||
|
|
@ -130,8 +130,6 @@ func testMain(m *testing.M) int {
|
||||||
defer os.RemoveAll(GOPATH)
|
defer os.RemoveAll(GOPATH)
|
||||||
os.Setenv("GOPATH", GOPATH)
|
os.Setenv("GOPATH", GOPATH)
|
||||||
|
|
||||||
// Copy testdata into GOPATH/src/testarchive, along with a go.mod file
|
|
||||||
// declaring the same path.
|
|
||||||
modRoot := filepath.Join(GOPATH, "src", "testcshared")
|
modRoot := filepath.Join(GOPATH, "src", "testcshared")
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
if err := overlayDir(modRoot, "testdata"); err != nil {
|
||||||
log.Panic(err)
|
log.Panic(err)
|
||||||
|
|
@ -257,14 +255,38 @@ func runCC(t *testing.T, args ...string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func createHeaders() error {
|
func createHeaders() error {
|
||||||
args := []string{"go", "install", "-i", "-buildmode=c-shared",
|
// The 'cgo' command generates a number of additional artifacts,
|
||||||
"-installsuffix", "testcshared", "./libgo"}
|
// but we're only interested in the header.
|
||||||
|
// Shunt the rest of the outputs to a temporary directory.
|
||||||
|
objDir, err := ioutil.TempDir("", "testcshared_obj")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(objDir)
|
||||||
|
|
||||||
|
// Generate a C header file for p, which is a non-main dependency
|
||||||
|
// of main package libgo.
|
||||||
|
//
|
||||||
|
// TODO(golang.org/issue/35715): This should be simpler.
|
||||||
|
args := []string{"go", "tool", "cgo",
|
||||||
|
"-objdir", objDir,
|
||||||
|
"-exportheader", "p.h",
|
||||||
|
filepath.Join(".", "p", "p.go")}
|
||||||
cmd := exec.Command(args[0], args[1:]...)
|
cmd := exec.Command(args[0], args[1:]...)
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
|
return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate a C header file for libgo itself.
|
||||||
|
args = []string{"go", "install", "-buildmode=c-shared",
|
||||||
|
"-installsuffix", "testcshared", "./libgo"}
|
||||||
|
cmd = exec.Command(args[0], args[1:]...)
|
||||||
|
out, err = cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
|
||||||
|
}
|
||||||
|
|
||||||
args = []string{"go", "build", "-buildmode=c-shared",
|
args = []string{"go", "build", "-buildmode=c-shared",
|
||||||
"-installsuffix", "testcshared",
|
"-installsuffix", "testcshared",
|
||||||
"-o", libgoname,
|
"-o", libgoname,
|
||||||
|
|
@ -522,7 +544,7 @@ func TestPIE(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that installing a second time recreates the header files.
|
// Test that installing a second time recreates the header file.
|
||||||
func TestCachedInstall(t *testing.T) {
|
func TestCachedInstall(t *testing.T) {
|
||||||
tmpdir, err := ioutil.TempDir("", "cshared")
|
tmpdir, err := ioutil.TempDir("", "cshared")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -536,7 +558,7 @@ func TestCachedInstall(t *testing.T) {
|
||||||
|
|
||||||
env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
|
env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
|
||||||
|
|
||||||
buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
|
buildcmd := []string{"go", "install", "-x", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
|
||||||
|
|
||||||
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
|
||||||
cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
|
cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
|
||||||
|
|
@ -577,16 +599,10 @@ func TestCachedInstall(t *testing.T) {
|
||||||
if libgoh == "" {
|
if libgoh == "" {
|
||||||
t.Fatal("libgo.h not installed")
|
t.Fatal("libgo.h not installed")
|
||||||
}
|
}
|
||||||
if ph == "" {
|
|
||||||
t.Fatal("p.h not installed")
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Remove(libgoh); err != nil {
|
if err := os.Remove(libgoh); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := os.Remove(ph); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
|
cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
|
||||||
cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
|
cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
|
||||||
|
|
@ -601,9 +617,6 @@ func TestCachedInstall(t *testing.T) {
|
||||||
if _, err := os.Stat(libgoh); err != nil {
|
if _, err := os.Stat(libgoh); err != nil {
|
||||||
t.Errorf("libgo.h not installed in second run: %v", err)
|
t.Errorf("libgo.h not installed in second run: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(ph); err != nil {
|
|
||||||
t.Errorf("p.h not installed in second run: %v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// copyFile copies src to dst.
|
// copyFile copies src to dst.
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
# We are testing cgo -godefs, which translates Go files that use
|
|
||||||
# import "C" into Go files with Go definitions of types defined in the
|
|
||||||
# import "C" block. Add more tests here.
|
|
||||||
FILE_PREFIXES="anonunion issue8478 fieldtypedef"
|
|
||||||
|
|
||||||
cd testdata
|
|
||||||
|
|
||||||
RM=
|
|
||||||
for FP in $FILE_PREFIXES
|
|
||||||
do
|
|
||||||
go tool cgo -godefs -srcdir . ${FP}.go > ${FP}_defs.go
|
|
||||||
RM="${RM} ${FP}_defs.go"
|
|
||||||
done
|
|
||||||
|
|
||||||
go build -o testgodefs . && ./testgodefs
|
|
||||||
EXIT=$?
|
|
||||||
rm -rf _obj testgodefs ${RM}
|
|
||||||
exit $EXIT
|
|
||||||
33
misc/cgo/testgodefs/testdata/issue37479.go
vendored
Normal file
33
misc/cgo/testgodefs/testdata/issue37479.go
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2020 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
//
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
typedef struct A A;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct A *next;
|
||||||
|
struct A **prev;
|
||||||
|
} N;
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
N n;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct B
|
||||||
|
{
|
||||||
|
A* a;
|
||||||
|
} B;
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
type N C.N
|
||||||
|
|
||||||
|
type A C.A
|
||||||
|
|
||||||
|
type B C.B
|
||||||
23
misc/cgo/testgodefs/testdata/issue37621.go
vendored
Normal file
23
misc/cgo/testgodefs/testdata/issue37621.go
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright 2020 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
//
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
struct tt {
|
||||||
|
long long a;
|
||||||
|
long long b;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct s {
|
||||||
|
struct tt ts[3];
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
type TT C.struct_tt
|
||||||
|
|
||||||
|
type S C.struct_s
|
||||||
8
misc/cgo/testgodefs/testdata/main.go
vendored
8
misc/cgo/testgodefs/testdata/main.go
vendored
|
|
@ -11,5 +11,13 @@ var v2 = v1.L
|
||||||
// Test that P, Q, and R all point to byte.
|
// Test that P, Q, and R all point to byte.
|
||||||
var v3 = Issue8478{P: (*byte)(nil), Q: (**byte)(nil), R: (***byte)(nil)}
|
var v3 = Issue8478{P: (*byte)(nil), Q: (**byte)(nil), R: (***byte)(nil)}
|
||||||
|
|
||||||
|
// Test that N, A and B are fully defined
|
||||||
|
var v4 = N{}
|
||||||
|
var v5 = A{}
|
||||||
|
var v6 = B{}
|
||||||
|
|
||||||
|
// Test that S is fully defined
|
||||||
|
var v7 = S{}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
85
misc/cgo/testgodefs/testgodefs_test.go
Normal file
85
misc/cgo/testgodefs/testgodefs_test.go
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
// Copyright 2019 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package testgodefs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// We are testing cgo -godefs, which translates Go files that use
|
||||||
|
// import "C" into Go files with Go definitions of types defined in the
|
||||||
|
// import "C" block. Add more tests here.
|
||||||
|
var filePrefixes = []string{
|
||||||
|
"anonunion",
|
||||||
|
"issue8478",
|
||||||
|
"fieldtypedef",
|
||||||
|
"issue37479",
|
||||||
|
"issue37621",
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGoDefs(t *testing.T) {
|
||||||
|
testdata, err := filepath.Abs("testdata")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
gopath, err := ioutil.TempDir("", "testgodefs-gopath")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(gopath)
|
||||||
|
|
||||||
|
dir := filepath.Join(gopath, "src", "testgodefs")
|
||||||
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fp := range filePrefixes {
|
||||||
|
cmd := exec.Command("go", "tool", "cgo",
|
||||||
|
"-godefs",
|
||||||
|
"-srcdir", testdata,
|
||||||
|
"-objdir", dir,
|
||||||
|
fp+".go")
|
||||||
|
cmd.Stderr = new(bytes.Buffer)
|
||||||
|
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main, err := ioutil.ReadFile(filepath.Join("testdata", "main.go"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, "main.go"), main, 0644); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), []byte("module testgodefs\ngo 1.14\n"), 0644); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use 'go run' to build and run the resulting binary in a single step,
|
||||||
|
// instead of invoking 'go build' and the resulting binary separately, so that
|
||||||
|
// this test can pass on mobile builders, which do not copy artifacts back
|
||||||
|
// from remote invocations.
|
||||||
|
cmd := exec.Command("go", "run", ".")
|
||||||
|
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
|
||||||
|
cmd.Dir = dir
|
||||||
|
if out, err := cmd.CombinedOutput(); err != nil {
|
||||||
|
t.Fatalf("%s [%s]: %v\n%s", strings.Join(cmd.Args, " "), dir, err, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ func testMain(m *testing.M) int {
|
||||||
|
|
||||||
os.Setenv("LD_LIBRARY_PATH", modRoot)
|
os.Setenv("LD_LIBRARY_PATH", modRoot)
|
||||||
|
|
||||||
goCmd(nil, "build", "-i", "-buildmode=plugin", "./plugin1")
|
goCmd(nil, "build", "-buildmode=plugin", "./plugin1")
|
||||||
goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
|
goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
|
||||||
so, err := ioutil.ReadFile("plugin2.so")
|
so, err := ioutil.ReadFile("plugin2.so")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,31 +9,33 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"debug/elf"
|
"debug/elf"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/build"
|
"go/build"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var gopathInstallDir, gorootInstallDir, suffix string
|
var gopathInstallDir, gorootInstallDir string
|
||||||
|
|
||||||
// This is the smallest set of packages we can link into a shared
|
// This is the smallest set of packages we can link into a shared
|
||||||
// library (runtime/cgo is built implicitly).
|
// library (runtime/cgo is built implicitly).
|
||||||
var minpkgs = []string{"runtime", "sync/atomic"}
|
var minpkgs = []string{"runtime", "sync/atomic"}
|
||||||
var soname = "libruntime,sync-atomic.so"
|
var soname = "libruntime,sync-atomic.so"
|
||||||
|
|
||||||
|
var testX = flag.Bool("testx", false, "if true, pass -x to 'go' subcommands invoked by the test")
|
||||||
|
var testWork = flag.Bool("testwork", false, "if true, log and do not delete the temporary working directory")
|
||||||
|
|
||||||
// run runs a command and calls t.Errorf if it fails.
|
// run runs a command and calls t.Errorf if it fails.
|
||||||
func run(t *testing.T, msg string, args ...string) {
|
func run(t *testing.T, msg string, args ...string) {
|
||||||
c := exec.Command(args[0], args[1:]...)
|
c := exec.Command(args[0], args[1:]...)
|
||||||
|
|
@ -45,31 +47,34 @@ func run(t *testing.T, msg string, args ...string) {
|
||||||
// goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
|
// goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
|
||||||
// t.Fatalf if the command fails.
|
// t.Fatalf if the command fails.
|
||||||
func goCmd(t *testing.T, args ...string) string {
|
func goCmd(t *testing.T, args ...string) string {
|
||||||
newargs := []string{args[0], "-installsuffix=" + suffix}
|
newargs := []string{args[0]}
|
||||||
if testing.Verbose() {
|
if *testX {
|
||||||
newargs = append(newargs, "-x")
|
newargs = append(newargs, "-x")
|
||||||
}
|
}
|
||||||
newargs = append(newargs, args[1:]...)
|
newargs = append(newargs, args[1:]...)
|
||||||
c := exec.Command("go", newargs...)
|
c := exec.Command("go", newargs...)
|
||||||
|
|
||||||
stderr := new(strings.Builder)
|
stderr := new(strings.Builder)
|
||||||
var output []byte
|
c.Stderr = stderr
|
||||||
var err error
|
|
||||||
if testing.Verbose() {
|
if testing.Verbose() && t == nil {
|
||||||
fmt.Printf("+ go %s\n", strings.Join(args, " "))
|
fmt.Fprintf(os.Stderr, "+ go %s\n", strings.Join(args, " "))
|
||||||
c.Stderr = os.Stderr
|
c.Stderr = os.Stderr
|
||||||
stderr.WriteString("(output above)")
|
|
||||||
} else {
|
|
||||||
c.Stderr = stderr
|
|
||||||
}
|
}
|
||||||
output, err = c.Output()
|
output, err := c.Output()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if t != nil {
|
if t != nil {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
|
t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
|
// Panic instead of using log.Fatalf so that deferred cleanup may run in testMain.
|
||||||
|
log.Panicf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if testing.Verbose() && t != nil {
|
||||||
|
t.Logf("go %s", strings.Join(args, " "))
|
||||||
|
if stderr.Len() > 0 {
|
||||||
|
t.Logf("%s", stderr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return string(bytes.TrimSpace(output))
|
return string(bytes.TrimSpace(output))
|
||||||
|
|
@ -77,73 +82,63 @@ func goCmd(t *testing.T, args ...string) string {
|
||||||
|
|
||||||
// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
|
// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
|
||||||
func testMain(m *testing.M) (int, error) {
|
func testMain(m *testing.M) (int, error) {
|
||||||
// Because go install -buildmode=shared $standard_library_package always
|
workDir, err := ioutil.TempDir("", "shared_test")
|
||||||
// installs into $GOROOT, here are some gymnastics to come up with a unique
|
if err != nil {
|
||||||
// installsuffix to use in this test that we can clean up afterwards.
|
return 0, err
|
||||||
|
}
|
||||||
|
if *testWork || testing.Verbose() {
|
||||||
|
fmt.Printf("+ mkdir -p %s\n", workDir)
|
||||||
|
}
|
||||||
|
if !*testWork {
|
||||||
|
defer os.RemoveAll(workDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some tests need to edit the source in GOPATH, so copy this directory to a
|
||||||
|
// temporary directory and chdir to that.
|
||||||
|
gopath := filepath.Join(workDir, "gopath")
|
||||||
|
modRoot, err := cloneTestdataModule(gopath)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if testing.Verbose() {
|
||||||
|
fmt.Printf("+ export GOPATH=%s\n", gopath)
|
||||||
|
fmt.Printf("+ cd %s\n", modRoot)
|
||||||
|
}
|
||||||
|
os.Setenv("GOPATH", gopath)
|
||||||
|
// Explicitly override GOBIN as well, in case it was set through a GOENV file.
|
||||||
|
os.Setenv("GOBIN", filepath.Join(gopath, "bin"))
|
||||||
|
os.Chdir(modRoot)
|
||||||
|
os.Setenv("PWD", modRoot)
|
||||||
|
|
||||||
|
// The test also needs to install libraries into GOROOT/pkg, so copy the
|
||||||
|
// subset of GOROOT that we need.
|
||||||
|
//
|
||||||
|
// TODO(golang.org/issue/28553): Rework -buildmode=shared so that it does not
|
||||||
|
// need to write to GOROOT.
|
||||||
|
goroot := filepath.Join(workDir, "goroot")
|
||||||
|
if err := cloneGOROOTDeps(goroot); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if testing.Verbose() {
|
||||||
|
fmt.Fprintf(os.Stderr, "+ export GOROOT=%s\n", goroot)
|
||||||
|
}
|
||||||
|
os.Setenv("GOROOT", goroot)
|
||||||
|
|
||||||
myContext := build.Default
|
myContext := build.Default
|
||||||
|
myContext.GOROOT = goroot
|
||||||
|
myContext.GOPATH = gopath
|
||||||
runtimeP, err := myContext.Import("runtime", ".", build.ImportComment)
|
runtimeP, err := myContext.Import("runtime", ".", build.ImportComment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("import failed: %v", err)
|
return 0, fmt.Errorf("import failed: %v", err)
|
||||||
}
|
}
|
||||||
for i := 0; i < 10000; i++ {
|
gorootInstallDir = runtimeP.PkgTargetRoot + "_dynlink"
|
||||||
try := fmt.Sprintf("%s_%d_dynlink", runtimeP.PkgTargetRoot, rand.Int63())
|
|
||||||
err = os.Mkdir(try, 0700)
|
|
||||||
if os.IsExist(err) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
gorootInstallDir = try
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return 0, fmt.Errorf("can't create temporary directory: %v", err)
|
|
||||||
}
|
|
||||||
if gorootInstallDir == "" {
|
|
||||||
return 0, errors.New("could not create temporary directory after 10000 tries")
|
|
||||||
}
|
|
||||||
if testing.Verbose() {
|
|
||||||
fmt.Printf("+ mkdir -p %s\n", gorootInstallDir)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(gorootInstallDir)
|
|
||||||
|
|
||||||
// Some tests need to edit the source in GOPATH, so copy this directory to a
|
|
||||||
// temporary directory and chdir to that.
|
|
||||||
gopath, err := ioutil.TempDir("", "testshared")
|
|
||||||
if err != nil {
|
|
||||||
return 0, fmt.Errorf("TempDir failed: %v", err)
|
|
||||||
}
|
|
||||||
if testing.Verbose() {
|
|
||||||
fmt.Printf("+ mkdir -p %s\n", gopath)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(gopath)
|
|
||||||
|
|
||||||
modRoot := filepath.Join(gopath, "src", "testshared")
|
|
||||||
if err := overlayDir(modRoot, "testdata"); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
if testing.Verbose() {
|
|
||||||
fmt.Printf("+ cd %s\n", modRoot)
|
|
||||||
}
|
|
||||||
os.Chdir(modRoot)
|
|
||||||
os.Setenv("PWD", modRoot)
|
|
||||||
if err := ioutil.WriteFile("go.mod", []byte("module testshared\n"), 0666); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Setenv("GOPATH", gopath)
|
|
||||||
if testing.Verbose() {
|
|
||||||
fmt.Printf("+ export GOPATH=%s\n", gopath)
|
|
||||||
}
|
|
||||||
myContext.GOPATH = gopath
|
|
||||||
|
|
||||||
// All tests depend on runtime being built into a shared library. Because
|
// All tests depend on runtime being built into a shared library. Because
|
||||||
// that takes a few seconds, do it here and have all tests use the version
|
// that takes a few seconds, do it here and have all tests use the version
|
||||||
// built here.
|
// built here.
|
||||||
suffix = strings.Split(filepath.Base(gorootInstallDir), "_")[2]
|
|
||||||
goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
|
goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
|
||||||
|
|
||||||
myContext.InstallSuffix = suffix + "_dynlink"
|
myContext.InstallSuffix = "_dynlink"
|
||||||
depP, err := myContext.Import("./depBase", ".", build.ImportComment)
|
depP, err := myContext.Import("./depBase", ".", build.ImportComment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("import failed: %v", err)
|
return 0, fmt.Errorf("import failed: %v", err)
|
||||||
|
|
@ -160,10 +155,6 @@ func TestMain(m *testing.M) {
|
||||||
log.SetFlags(log.Lshortfile)
|
log.SetFlags(log.Lshortfile)
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
// Some of the tests install binaries into a custom GOPATH.
|
|
||||||
// That won't work if GOBIN is set.
|
|
||||||
os.Unsetenv("GOBIN")
|
|
||||||
|
|
||||||
exitCode, err := testMain(m)
|
exitCode, err := testMain(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
@ -171,6 +162,75 @@ func TestMain(m *testing.M) {
|
||||||
os.Exit(exitCode)
|
os.Exit(exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cloneTestdataModule clones the packages from src/testshared into gopath.
|
||||||
|
// It returns the directory within gopath at which the module root is located.
|
||||||
|
func cloneTestdataModule(gopath string) (string, error) {
|
||||||
|
modRoot := filepath.Join(gopath, "src", "testshared")
|
||||||
|
if err := overlayDir(modRoot, "testdata"); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module testshared\n"), 0644); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return modRoot, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// cloneGOROOTDeps copies (or symlinks) the portions of GOROOT/src and
|
||||||
|
// GOROOT/pkg relevant to this test into the given directory.
|
||||||
|
// It must be run from within the testdata module.
|
||||||
|
func cloneGOROOTDeps(goroot string) error {
|
||||||
|
oldGOROOT := strings.TrimSpace(goCmd(nil, "env", "GOROOT"))
|
||||||
|
if oldGOROOT == "" {
|
||||||
|
return fmt.Errorf("go env GOROOT returned an empty string")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before we clone GOROOT, figure out which packages we need to copy over.
|
||||||
|
listArgs := []string{
|
||||||
|
"list",
|
||||||
|
"-deps",
|
||||||
|
"-f", "{{if and .Standard (not .ForTest)}}{{.ImportPath}}{{end}}",
|
||||||
|
}
|
||||||
|
stdDeps := goCmd(nil, append(listArgs, minpkgs...)...)
|
||||||
|
testdataDeps := goCmd(nil, append(listArgs, "-test", "./...")...)
|
||||||
|
|
||||||
|
pkgs := append(strings.Split(strings.TrimSpace(stdDeps), "\n"),
|
||||||
|
strings.Split(strings.TrimSpace(testdataDeps), "\n")...)
|
||||||
|
sort.Strings(pkgs)
|
||||||
|
var pkgRoots []string
|
||||||
|
for _, pkg := range pkgs {
|
||||||
|
parentFound := false
|
||||||
|
for _, prev := range pkgRoots {
|
||||||
|
if strings.HasPrefix(pkg, prev) {
|
||||||
|
// We will copy in the source for pkg when we copy in prev.
|
||||||
|
parentFound = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !parentFound {
|
||||||
|
pkgRoots = append(pkgRoots, pkg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gorootDirs := []string{
|
||||||
|
"pkg/tool",
|
||||||
|
"pkg/include",
|
||||||
|
}
|
||||||
|
for _, pkg := range pkgRoots {
|
||||||
|
gorootDirs = append(gorootDirs, filepath.Join("src", pkg))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, dir := range gorootDirs {
|
||||||
|
if testing.Verbose() {
|
||||||
|
fmt.Fprintf(os.Stderr, "+ cp -r %s %s\n", filepath.Join(oldGOROOT, dir), filepath.Join(goroot, dir))
|
||||||
|
}
|
||||||
|
if err := overlayDir(filepath.Join(goroot, dir), filepath.Join(oldGOROOT, dir)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// The shared library was built at the expected location.
|
// The shared library was built at the expected location.
|
||||||
func TestSOBuilt(t *testing.T) {
|
func TestSOBuilt(t *testing.T) {
|
||||||
_, err := os.Stat(filepath.Join(gorootInstallDir, soname))
|
_, err := os.Stat(filepath.Join(gorootInstallDir, soname))
|
||||||
|
|
@ -219,6 +279,7 @@ func TestNoTextrel(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// The shared library does not contain symbols called ".dup"
|
// The shared library does not contain symbols called ".dup"
|
||||||
|
// (See golang.org/issue/14841.)
|
||||||
func TestNoDupSymbols(t *testing.T) {
|
func TestNoDupSymbols(t *testing.T) {
|
||||||
sopath := filepath.Join(gorootInstallDir, soname)
|
sopath := filepath.Join(gorootInstallDir, soname)
|
||||||
f, err := elf.Open(sopath)
|
f, err := elf.Open(sopath)
|
||||||
|
|
@ -695,7 +756,7 @@ func resetFileStamps() {
|
||||||
}
|
}
|
||||||
reset := func(path string) {
|
reset := func(path string) {
|
||||||
if err := filepath.Walk(path, chtime); err != nil {
|
if err := filepath.Walk(path, chtime); err != nil {
|
||||||
log.Fatalf("resetFileStamps failed: %v", err)
|
log.Panicf("resetFileStamps failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -708,6 +769,7 @@ func resetFileStamps() {
|
||||||
// touch changes path and returns a function that changes it back.
|
// touch changes path and returns a function that changes it back.
|
||||||
// It also sets the time of the file, so that we can see if it is rewritten.
|
// It also sets the time of the file, so that we can see if it is rewritten.
|
||||||
func touch(t *testing.T, path string) (cleanup func()) {
|
func touch(t *testing.T, path string) (cleanup func()) {
|
||||||
|
t.Helper()
|
||||||
data, err := ioutil.ReadFile(path)
|
data, err := ioutil.ReadFile(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
@ -736,14 +798,32 @@ func touch(t *testing.T, path string) (cleanup func()) {
|
||||||
// assume it's a text file
|
// assume it's a text file
|
||||||
data = append(data, '\n')
|
data = append(data, '\n')
|
||||||
}
|
}
|
||||||
if err := ioutil.WriteFile(path, data, 0666); err != nil {
|
|
||||||
|
// If the file is still a symlink from an overlay, delete it so that we will
|
||||||
|
// replace it with a regular file instead of overwriting the symlinked one.
|
||||||
|
fi, err := os.Lstat(path)
|
||||||
|
if err == nil && !fi.Mode().IsRegular() {
|
||||||
|
fi, err = os.Stat(path)
|
||||||
|
if err := os.Remove(path); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're replacing a symlink to a read-only file, make the new file
|
||||||
|
// user-writable.
|
||||||
|
perm := fi.Mode().Perm() | 0200
|
||||||
|
|
||||||
|
if err := ioutil.WriteFile(path, data, perm); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := os.Chtimes(path, nearlyNew, nearlyNew); err != nil {
|
if err := os.Chtimes(path, nearlyNew, nearlyNew); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
return func() {
|
return func() {
|
||||||
if err := ioutil.WriteFile(path, old, 0666); err != nil {
|
if err := ioutil.WriteFile(path, old, perm); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ static void sigsegv() {
|
||||||
|
|
||||||
static void segvhandler(int signum) {
|
static void segvhandler(int signum) {
|
||||||
if (signum == SIGSEGV) {
|
if (signum == SIGSEGV) {
|
||||||
|
fprintf(stdout, "ok\ttestsigfwd\n");
|
||||||
exit(0); // success
|
exit(0); // success
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,8 @@ func requireTestSOSupported(t *testing.T) {
|
||||||
}
|
}
|
||||||
case "ppc64":
|
case "ppc64":
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
|
t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
|
||||||
}
|
}
|
||||||
case "mips64le", "mips64":
|
|
||||||
t.Skip("External linking not implemented on mips64.")
|
|
||||||
}
|
}
|
||||||
if runtime.GOOS == "android" {
|
if runtime.GOOS == "android" {
|
||||||
t.Skip("No exec facility on Android.")
|
t.Skip("No exec facility on Android.")
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,9 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
symBase, err := filepath.Rel(srcRoot, dstRoot)
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
symBase, err = filepath.Abs(srcRoot)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
|
||||||
|
|
@ -52,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,8 @@ func requireTestSOSupported(t *testing.T) {
|
||||||
}
|
}
|
||||||
case "ppc64":
|
case "ppc64":
|
||||||
if runtime.GOOS == "linux" {
|
if runtime.GOOS == "linux" {
|
||||||
t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
|
t.Skip("External linking not implemented on linux/ppc64 (issue #8912).")
|
||||||
}
|
}
|
||||||
case "mips64le", "mips64":
|
|
||||||
t.Skip("External linking not implemented on mips64.")
|
|
||||||
}
|
}
|
||||||
if runtime.GOOS == "android" {
|
if runtime.GOOS == "android" {
|
||||||
t.Skip("No exec facility on Android.")
|
t.Skip("No exec facility on Android.")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
chrome.omnibox.onInputEntered.addListener(function(t) {
|
chrome.omnibox.onInputEntered.addListener(function(t) {
|
||||||
var url = urlForInput(t);
|
var url = urlForInput(t);
|
||||||
if (url) {
|
if (url) {
|
||||||
chrome.tabs.getSelected(null, function(tab) {
|
chrome.tabs.query({ "active": true, "currentWindow": true }, function(tab) {
|
||||||
if (!tab) return;
|
if (!tab) return;
|
||||||
chrome.tabs.update(tab.id, { "url": url, "selected": true });
|
chrome.tabs.update(tab.id, { "url": url, "selected": true });
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,7 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't use the absolute path here, exec'ing make.bash fails with
|
srcRoot, err := filepath.Abs(srcRoot)
|
||||||
// “too many levels of symbolic links”.
|
|
||||||
symBase, err := filepath.Abs(srcRoot)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -51,11 +49,11 @@ func overlayDir(dstRoot, srcRoot string) error {
|
||||||
// Always copy directories (don't symlink them).
|
// Always copy directories (don't symlink them).
|
||||||
// If we add a file in the overlay, we don't want to add it in the original.
|
// If we add a file in the overlay, we don't want to add it in the original.
|
||||||
if info.IsDir() {
|
if info.IsDir() {
|
||||||
return os.Mkdir(dstPath, perm|0200)
|
return os.MkdirAll(dstPath, perm|0200)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the OS supports symlinks, use them instead of copying bytes.
|
// If the OS supports symlinks, use them instead of copying bytes.
|
||||||
if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
|
if err := os.Symlink(srcPath, dstPath); err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,41 @@
|
||||||
This directory contains helper file for trace viewer (`go tool trace`).
|
## Resources for Go's trace viewer
|
||||||
|
|
||||||
`trace_viewer_full.html` was generated by following
|
Go execution trace UI (`go tool trace`) embeds
|
||||||
[instructions](https://github.com/catapult-project/catapult/blob/master/tracing/docs/embedding-trace-viewer.md)
|
Chrome's trace viewer (Catapult) following the
|
||||||
on revision `dc970d3e1f7b3da5a2849de70ff253acdb70148f`
|
[instructions](
|
||||||
of [catapult](https://github.com/catapult-project/catapult) using:
|
https://chromium.googlesource.com/catapult/+/refs/heads/master/tracing/docs/embedding-trace-viewer.md). This directory contains
|
||||||
|
the helper files to embed Chrome's trace viewer.
|
||||||
|
|
||||||
|
The current resources were generated/copied from
|
||||||
|
[`Catapult@9508452e18f130c98499cb4c4f1e1efaedee8962`](
|
||||||
|
https://chromium.googlesource.com/catapult/+/9508452e18f130c98499cb4c4f1e1efaedee8962).
|
||||||
|
|
||||||
|
### Updating `trace_viewer_full.html`
|
||||||
|
|
||||||
|
The file was generated by catapult's `vulcanize_trace_viewer` command.
|
||||||
```
|
```
|
||||||
catapult$ ./tracing/bin/vulcanize_trace_viewer --config=full
|
$ git clone https://chromium.googlesource.com/catapult
|
||||||
catapult$ cp tracing/bin/trace_viewer_full.html $GOROOT/misc/trace/trace_viewer_lean.html
|
$ cd catapult
|
||||||
|
$ ./tracing/bin/vulcanize_trace_viewer --config=full
|
||||||
|
$ cp tracing/bin/trace_viewer_full.html $GOROOT/misc/trace/trace_viewer_full.html
|
||||||
```
|
```
|
||||||
|
|
||||||
We are supposed to use --config=lean (produces smaller html),
|
We are supposed to use --config=lean (produces smaller html),
|
||||||
but it is broken at the moment:
|
but it is broken at the moment:
|
||||||
https://github.com/catapult-project/catapult/issues/2247
|
https://github.com/catapult-project/catapult/issues/2247
|
||||||
|
|
||||||
|
### Updating `webcomponents.min.js`
|
||||||
|
|
||||||
|
`webcomponents.min.js` is necessary to let the trace viewer page
|
||||||
|
to import the `trace_viewer_full.html`.
|
||||||
|
This is copied from the catapult repo.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cp third_party/polymer/components/webcomponentsjs/webcomponents.min.js $GOROOT/misc/trace/webcomponents.min.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Licenses
|
||||||
|
|
||||||
The license for trace-viewer is as follows:
|
The license for trace-viewer is as follows:
|
||||||
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
@ -40,3 +64,42 @@ The license for trace-viewer is as follows:
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
The license for webcomponents.min.js is as follows:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
||||||
|
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
||||||
|
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
||||||
|
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
||||||
|
* Code distributed by Google as part of the polymer project is also
|
||||||
|
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
||||||
|
*/
|
||||||
|
// Copyright (c) 2014 The Polymer Authors. All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
14
misc/trace/webcomponents.min.js
vendored
Normal file
14
misc/trace/webcomponents.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -27,7 +27,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!global.fs && global.require) {
|
if (!global.fs && global.require) {
|
||||||
global.fs = require("fs");
|
const fs = require("fs");
|
||||||
|
if (Object.keys(fs) !== 0) {
|
||||||
|
global.fs = fs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const enosys = () => {
|
const enosys = () => {
|
||||||
|
|
@ -440,14 +443,14 @@
|
||||||
|
|
||||||
// func valueInstanceOf(v ref, t ref) bool
|
// func valueInstanceOf(v ref, t ref) bool
|
||||||
"syscall/js.valueInstanceOf": (sp) => {
|
"syscall/js.valueInstanceOf": (sp) => {
|
||||||
this.mem.setUint8(sp + 24, loadValue(sp + 8) instanceof loadValue(sp + 16));
|
this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
// func copyBytesToGo(dst []byte, src ref) (int, bool)
|
||||||
"syscall/js.copyBytesToGo": (sp) => {
|
"syscall/js.copyBytesToGo": (sp) => {
|
||||||
const dst = loadSlice(sp + 8);
|
const dst = loadSlice(sp + 8);
|
||||||
const src = loadValue(sp + 32);
|
const src = loadValue(sp + 32);
|
||||||
if (!(src instanceof Uint8Array)) {
|
if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {
|
||||||
this.mem.setUint8(sp + 48, 0);
|
this.mem.setUint8(sp + 48, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -461,7 +464,7 @@
|
||||||
"syscall/js.copyBytesToJS": (sp) => {
|
"syscall/js.copyBytesToJS": (sp) => {
|
||||||
const dst = loadValue(sp + 8);
|
const dst = loadValue(sp + 8);
|
||||||
const src = loadSlice(sp + 16);
|
const src = loadSlice(sp + 16);
|
||||||
if (!(dst instanceof Uint8Array)) {
|
if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {
|
||||||
this.mem.setUint8(sp + 48, 0);
|
this.mem.setUint8(sp + 48, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
:: Copyright 2012 The Go Authors. All rights reserved.
|
:: Copyright 2012 The Go Authors. All rights reserved.
|
||||||
:: Use of this source code is governed by a BSD-style
|
:: Use of this source code is governed by a BSD-style
|
||||||
:: license that can be found in the LICENSE file.
|
:: license that can be found in the LICENSE file.
|
||||||
|
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
setlocal
|
setlocal
|
||||||
|
|
|
||||||
|
|
@ -433,7 +433,7 @@ func (tr *Reader) readHeader() (*Header, *block, error) {
|
||||||
// files generated by a pre-Go1.8 toolchain. If the generated file
|
// files generated by a pre-Go1.8 toolchain. If the generated file
|
||||||
// happened to have a prefix field that parses as valid
|
// happened to have a prefix field that parses as valid
|
||||||
// atime and ctime fields (e.g., when they are valid octal strings),
|
// atime and ctime fields (e.g., when they are valid octal strings),
|
||||||
// then it is impossible to distinguish between an valid GNU file
|
// then it is impossible to distinguish between a valid GNU file
|
||||||
// and an invalid pre-Go1.8 file.
|
// and an invalid pre-Go1.8 file.
|
||||||
//
|
//
|
||||||
// See https://golang.org/issues/12594
|
// See https://golang.org/issues/12594
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"internal/obscuretestdata"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -19,11 +20,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type ZipTest struct {
|
type ZipTest struct {
|
||||||
Name string
|
Name string
|
||||||
Source func() (r io.ReaderAt, size int64) // if non-nil, used instead of testdata/<Name> file
|
Source func() (r io.ReaderAt, size int64) // if non-nil, used instead of testdata/<Name> file
|
||||||
Comment string
|
Comment string
|
||||||
File []ZipTestFile
|
File []ZipTestFile
|
||||||
Error error // the error that Opening this file should return
|
Obscured bool // needed for Apple notarization (golang.org/issue/34986)
|
||||||
|
Error error // the error that Opening this file should return
|
||||||
}
|
}
|
||||||
|
|
||||||
type ZipTestFile struct {
|
type ZipTestFile struct {
|
||||||
|
|
@ -189,8 +191,12 @@ var tests = []ZipTest{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// created by Go, before we wrote the "optional" data
|
// created by Go, before we wrote the "optional" data
|
||||||
// descriptor signatures (which are required by OS X)
|
// descriptor signatures (which are required by macOS).
|
||||||
Name: "go-no-datadesc-sig.zip",
|
// Use obscured file to avoid Apple’s notarization service
|
||||||
|
// rejecting the toolchain due to an inability to unzip this archive.
|
||||||
|
// See golang.org/issue/34986
|
||||||
|
Name: "go-no-datadesc-sig.zip.base64",
|
||||||
|
Obscured: true,
|
||||||
File: []ZipTestFile{
|
File: []ZipTestFile{
|
||||||
{
|
{
|
||||||
Name: "foo.txt",
|
Name: "foo.txt",
|
||||||
|
|
@ -208,7 +214,7 @@ var tests = []ZipTest{
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// created by Go, after we wrote the "optional" data
|
// created by Go, after we wrote the "optional" data
|
||||||
// descriptor signatures (which are required by OS X)
|
// descriptor signatures (which are required by macOS)
|
||||||
Name: "go-with-datadesc-sig.zip",
|
Name: "go-with-datadesc-sig.zip",
|
||||||
File: []ZipTestFile{
|
File: []ZipTestFile{
|
||||||
{
|
{
|
||||||
|
|
@ -496,8 +502,18 @@ func readTestZip(t *testing.T, zt ZipTest) {
|
||||||
rat, size := zt.Source()
|
rat, size := zt.Source()
|
||||||
z, err = NewReader(rat, size)
|
z, err = NewReader(rat, size)
|
||||||
} else {
|
} else {
|
||||||
|
path := filepath.Join("testdata", zt.Name)
|
||||||
|
if zt.Obscured {
|
||||||
|
tf, err := obscuretestdata.DecodeToTempFile(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("obscuretestdata.DecodeToTempFile(%s): %v", path, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer os.Remove(tf)
|
||||||
|
path = tf
|
||||||
|
}
|
||||||
var rc *ReadCloser
|
var rc *ReadCloser
|
||||||
rc, err = OpenReader(filepath.Join("testdata", zt.Name))
|
rc, err = OpenReader(path)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
defer rc.Close()
|
defer rc.Close()
|
||||||
z = &rc.Reader
|
z = &rc.Reader
|
||||||
|
|
|
||||||
BIN
src/archive/zip/testdata/go-no-datadesc-sig.zip
vendored
BIN
src/archive/zip/testdata/go-no-datadesc-sig.zip
vendored
Binary file not shown.
1
src/archive/zip/testdata/go-no-datadesc-sig.zip.base64
vendored
Normal file
1
src/archive/zip/testdata/go-no-datadesc-sig.zip.base64
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
UEsDBBQACAAAAGWHaECoZTJ+BAAAAAQAAAAHABgAZm9vLnR4dFVUBQAD3lVZT3V4CwABBPUBAAAEFAAAAGZvbwqoZTJ+BAAAAAQAAABQSwMEFAAIAAAAZodoQOmzogQEAAAABAAAAAcAGABiYXIudHh0VVQFAAPgVVlPdXgLAAEE9QEAAAQUAAAAYmFyCumzogQEAAAABAAAAFBLAQIUAxQACAAAAGWHaECoZTJ+BAAAAAQAAAAHABgAAAAAAAAAAACkgQAAAABmb28udHh0VVQFAAPeVVlPdXgLAAEE9QEAAAQUAAAAUEsBAhQDFAAIAAAAZodoQOmzogQEAAAABAAAAAcAGAAAAAAAAAAAAKSBTQAAAGJhci50eHRVVAUAA+BVWU91eAsAAQT1AQAABBQAAABQSwUGAAAAAAIAAgCaAAAAmgAAAAAA
|
||||||
|
|
@ -147,7 +147,7 @@ func TestReader(t *testing.T) {
|
||||||
for i := 0; i < len(texts)-1; i++ {
|
for i := 0; i < len(texts)-1; i++ {
|
||||||
texts[i] = str + "\n"
|
texts[i] = str + "\n"
|
||||||
all += texts[i]
|
all += texts[i]
|
||||||
str += string(i%26 + 'a')
|
str += string(rune(i)%26 + 'a')
|
||||||
}
|
}
|
||||||
texts[len(texts)-1] = all
|
texts[len(texts)-1] = all
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ var (
|
||||||
ErrTooLong = errors.New("bufio.Scanner: token too long")
|
ErrTooLong = errors.New("bufio.Scanner: token too long")
|
||||||
ErrNegativeAdvance = errors.New("bufio.Scanner: SplitFunc returns negative advance count")
|
ErrNegativeAdvance = errors.New("bufio.Scanner: SplitFunc returns negative advance count")
|
||||||
ErrAdvanceTooFar = errors.New("bufio.Scanner: SplitFunc returns advance count beyond input")
|
ErrAdvanceTooFar = errors.New("bufio.Scanner: SplitFunc returns advance count beyond input")
|
||||||
|
ErrBadReadCount = errors.New("bufio.Scanner: Read returned impossible count")
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -211,6 +212,10 @@ func (s *Scanner) Scan() bool {
|
||||||
// be extra careful: Scanner is for safe, simple jobs.
|
// be extra careful: Scanner is for safe, simple jobs.
|
||||||
for loop := 0; ; {
|
for loop := 0; ; {
|
||||||
n, err := s.r.Read(s.buf[s.end:len(s.buf)])
|
n, err := s.r.Read(s.buf[s.end:len(s.buf)])
|
||||||
|
if n < 0 || len(s.buf)-s.end < n {
|
||||||
|
s.setErr(ErrBadReadCount)
|
||||||
|
break
|
||||||
|
}
|
||||||
s.end += n
|
s.end += n
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.setErr(err)
|
s.setErr(err)
|
||||||
|
|
|
||||||
|
|
@ -537,3 +537,58 @@ func TestHugeBuffer(t *testing.T) {
|
||||||
t.Fatal("after scan:", s.Err())
|
t.Fatal("after scan:", s.Err())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// negativeEOFReader returns an invalid -1 at the end, as though it
|
||||||
|
// were wrapping the read system call.
|
||||||
|
type negativeEOFReader int
|
||||||
|
|
||||||
|
func (r *negativeEOFReader) Read(p []byte) (int, error) {
|
||||||
|
if *r > 0 {
|
||||||
|
c := int(*r)
|
||||||
|
if c > len(p) {
|
||||||
|
c = len(p)
|
||||||
|
}
|
||||||
|
for i := 0; i < c; i++ {
|
||||||
|
p[i] = 'a'
|
||||||
|
}
|
||||||
|
p[c-1] = '\n'
|
||||||
|
*r -= negativeEOFReader(c)
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
return -1, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that the scanner doesn't panic on a reader that returns a
|
||||||
|
// negative count of bytes read (issue 38053).
|
||||||
|
func TestNegativeEOFReader(t *testing.T) {
|
||||||
|
r := negativeEOFReader(10)
|
||||||
|
scanner := NewScanner(&r)
|
||||||
|
c := 0
|
||||||
|
for scanner.Scan() {
|
||||||
|
c++
|
||||||
|
if c > 1 {
|
||||||
|
t.Error("read too many lines")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if scanner.Err() == nil {
|
||||||
|
t.Error("scanner.Err returned nil, expected an error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// largeReader returns an invalid count that is larger than the number
|
||||||
|
// of bytes requested.
|
||||||
|
type largeReader struct{}
|
||||||
|
|
||||||
|
func (largeReader) Read(p []byte) (int, error) {
|
||||||
|
return len(p) + 1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLargeReader(t *testing.T) {
|
||||||
|
scanner := NewScanner(largeReader{})
|
||||||
|
for scanner.Scan() {
|
||||||
|
}
|
||||||
|
if scanner.Err() == nil {
|
||||||
|
t.Error("scanner.Err returned nil, expected an error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import (
|
||||||
. "bytes"
|
. "bytes"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"runtime"
|
|
||||||
"testing"
|
"testing"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
@ -495,20 +494,20 @@ func TestGrow(t *testing.T) {
|
||||||
x := []byte{'x'}
|
x := []byte{'x'}
|
||||||
y := []byte{'y'}
|
y := []byte{'y'}
|
||||||
tmp := make([]byte, 72)
|
tmp := make([]byte, 72)
|
||||||
for _, startLen := range []int{0, 100, 1000, 10000, 100000} {
|
for _, growLen := range []int{0, 100, 1000, 10000, 100000} {
|
||||||
xBytes := Repeat(x, startLen)
|
for _, startLen := range []int{0, 100, 1000, 10000, 100000} {
|
||||||
for _, growLen := range []int{0, 100, 1000, 10000, 100000} {
|
xBytes := Repeat(x, startLen)
|
||||||
|
|
||||||
buf := NewBuffer(xBytes)
|
buf := NewBuffer(xBytes)
|
||||||
// If we read, this affects buf.off, which is good to test.
|
// If we read, this affects buf.off, which is good to test.
|
||||||
readBytes, _ := buf.Read(tmp)
|
readBytes, _ := buf.Read(tmp)
|
||||||
buf.Grow(growLen)
|
|
||||||
yBytes := Repeat(y, growLen)
|
yBytes := Repeat(y, growLen)
|
||||||
|
allocs := testing.AllocsPerRun(100, func() {
|
||||||
|
buf.Grow(growLen)
|
||||||
|
buf.Write(yBytes)
|
||||||
|
})
|
||||||
// Check no allocation occurs in write, as long as we're single-threaded.
|
// Check no allocation occurs in write, as long as we're single-threaded.
|
||||||
var m1, m2 runtime.MemStats
|
if allocs != 0 {
|
||||||
runtime.ReadMemStats(&m1)
|
|
||||||
buf.Write(yBytes)
|
|
||||||
runtime.ReadMemStats(&m2)
|
|
||||||
if runtime.GOMAXPROCS(-1) == 1 && m1.Mallocs != m2.Mallocs {
|
|
||||||
t.Errorf("allocation occurred during write")
|
t.Errorf("allocation occurred during write")
|
||||||
}
|
}
|
||||||
// Check that buffer has correct data.
|
// Check that buffer has correct data.
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue