WEBVTT 00:00:04.524 --> 00:00:06.694 good evening again this is the first time 00:00:06.699 --> 00:00:10.699 I'm seeing this okay I'm holding it up 00:00:10.699 --> 00:00:14.699 this is a gopher Singapore edition so 00:00:14.699 --> 00:00:21.915 gopher Merlion and the title of my talk 00:00:21.957 --> 00:00:24.518 if I speak it quickly 00:00:24.524 --> 00:00:28.524 oops stay 00:00:28.741 --> 00:00:31.821 nvm it doesn't want to 00:00:31.821 --> 00:00:33.072 title of my talk if you speak it quickly 00:00:33.132 --> 00:00:37.674 is Go for you? That's a pun there. 00:00:44.310 --> 00:00:47.250 All of us have limited mental capacity 99:59:59.999 --> 99:59:59.999 limited mind budget 00:00:48.380 --> 00:00:52.380 budget some of us can keep more things 99:59:59.999 --> 99:59:59.999 in our mind some of us can keep less 99:59:59.999 --> 99:59:59.999 things in our mind but you know in all 99:59:59.999 --> 99:59:59.999 cases it's limited so what do you mean 99:59:59.999 --> 99:59:59.999 by mine budget if you know how to drive 99:59:59.999 --> 99:59:59.999 a car it's instinctive 99:59:59.999 --> 99:59:59.999 you still know you still need to know 99:59:59.999 --> 99:59:59.999 where you're going so that consumes 99:59:59.999 --> 99:59:59.999 energy and mine budget so the point I'm 99:59:59.999 --> 99:59:59.999 trying to ask is what are your current 99:59:59.999 --> 99:59:59.999 skills what you currently do today and 99:59:59.999 --> 99:59:59.999 what you want to do tomorrow so for 99:59:59.999 --> 99:59:59.999 example if I currently write stuff for 99:59:59.999 --> 99:59:59.999 the web 99:59:59.999 --> 99:59:59.999 typically web front-ends I know 99:59:59.999 --> 99:59:59.999 JavaScript quite well by definition but 99:59:59.999 --> 99:59:59.999 I want to write back-end stuff around 99:59:59.999 --> 99:59:59.999 the right back-end servers I want to 99:59:59.999 --> 99:59:59.999 write API service your look you know 99:59:59.999 --> 99:59:59.999 because you can write back-end stuff in 99:59:59.999 --> 99:59:59.999 JavaScript it's called no GS you still 99:59:59.999 --> 99:59:59.999 need to know about the rules of writing 99:59:59.999 --> 99:59:59.999 API servers you still need to learn 99:59:59.999 --> 99:59:59.999 about that domain but you don't have to 99:59:59.999 --> 99:59:59.999 learn a new language because learning 99:59:59.999 --> 99:59:59.999 new stuff consumes mine budget and it's 99:59:59.999 --> 99:59:59.999 difficult 99:59:59.999 --> 99:59:59.999 before coming to go I used to write in 99:59:59.999 --> 99:59:59.999 Java so I know Java quite well and I 99:59:59.999 --> 99:59:59.999 want to write web front-ends well you 99:59:59.999 --> 99:59:59.999 can write web front-ends in Java it's 99:59:59.999 --> 99:59:59.999 not impossible but it's like using that 99:59:59.999 --> 99:59:59.999 to pull out nails so the point I'm 99:59:59.999 --> 99:59:59.999 trying to say 99:59:59.999 --> 99:59:59.999 the final point I'm trying to make is 99:59:59.999 --> 99:59:59.999 you need to have the right tools so what 99:59:59.999 --> 99:59:59.999 is goal good for so hammer is good for 99:59:59.999 --> 99:59:59.999 hammering in stuff that cow hammer is 99:59:59.999 --> 99:59:59.999 not good for pulling out nails go is 99:59:59.999 --> 99:59:59.999 good for writing cloud services back-end 99:59:59.999 --> 99:59:59.999 service it's good for being well this is 99:59:59.999 --> 99:59:59.999 debatable but those people who have 99:59:59.999 --> 99:59:59.999 written in go think it's actually quite 99:59:59.999 --> 99:59:59.999 simple to read and understand it's good 99:59:59.999 --> 99:59:59.999 for having this thing funny thing called 99:59:59.999 --> 99:59:59.999 implicit interface satisfaction which 99:59:59.999 --> 99:59:59.999 I'll talk about in a while it's got 99:59:59.999 --> 99:59:59.999 fantastic concurrency and my favorite 99:59:59.999 --> 99:59:59.999 feature its Java done right it's 99:59:59.999 --> 99:59:59.999 cross-platform 99:59:59.999 --> 99:59:59.999 Sogo is somewhat familiar that's the 99:59:59.999 --> 99:59:59.999 first line hello will in go if you 99:59:59.999 --> 99:59:59.999 ignore the funny fmt in the capital case 99:59:59.999 --> 99:59:59.999 it's not a class print line it just goes 99:59:59.999 --> 99:59:59.999 way of denoting a public variable you 99:59:59.999 --> 99:59:59.999 see it's pretty much the same across 99:59:59.999 --> 99:59:59.999 many many different languages so goal is 99:59:59.999 --> 99:59:59.999 somewhat familiar and therefore somewhat 99:59:59.999 --> 99:59:59.999 easy to learn in fact go about design to 99:59:59.999 --> 99:59:59.999 be easy to learn anybody who comes from 99:59:59.999 --> 99:59:59.999 a Java environment or c-lite language 99:59:59.999 --> 99:59:59.999 will find go somewhat familiar go is 99:59:59.999 --> 99:59:59.999 definitely type safe I like to I like to 99:59:59.999 --> 99:59:59.999 put up this example do you think this 99:59:59.999 --> 99:59:59.999 come this program will run do you think 99:59:59.999 --> 99:59:59.999 this program will compile really compile 99:59:59.999 --> 99:59:59.999 it won't even compile let's try how many 99:59:59.999 --> 99:59:59.999 of you have run your presentations 99:59:59.999 --> 99:59:59.999 before I'm going to run the presentation 99:59:59.999 --> 99:59:59.999 and let's read their messages go error 99:59:59.999 --> 99:59:59.999 messages are not too bad actually 99:59:59.999 --> 99:59:59.999 so what it's done is taken this HTML fed 99:59:59.999 --> 99:59:59.999 it into a temporary file called compiled 99:59:59.999 --> 99:59:59.999 0 dot go and the compiler complained 99:59:59.999 --> 99:59:59.999 cannot use B type string in an integer 99:59:59.999 --> 99:59:59.999 for assignment can you do in JavaScript 99:59:59.999 --> 99:59:59.999 yes or no yes let's prove it and you put 99:59:59.999 --> 99:59:59.999 down a microphone 99:59:59.999 --> 99:59:59.999 so I is definitely okay thank you my 99:59:59.999 --> 99:59:59.999 anything so I is definitely an integer 99:59:59.999 --> 99:59:59.999 now I is a string 99:59:59.999 --> 99:59:59.999 javascript is bad truffles I'm starting 99:59:59.999 --> 99:59:59.999 a flame war here actually not true 99:59:59.999 --> 99:59:59.999 javascript is a pretty good language now 99:59:59.999 --> 99:59:59.999 in a godo so let's talk about go alright 99:59:59.999 --> 99:59:59.999 this one is not so obvious how strongly 99:59:59.999 --> 99:59:59.999 typesafe is go 99:59:59.999 --> 99:59:59.999 why type safety at all but let's let's 99:59:59.999 --> 99:59:59.999 look at this code and let's see whether 99:59:59.999 --> 99:59:59.999 it will compile at all 99:59:59.999 --> 99:59:59.999 I declare a type called mynum as an 99:59:59.999 --> 99:59:59.999 integer and over here I declare a 99:59:59.999 --> 99:59:59.999 variable I it's of type my num and I 99:59:59.999 --> 99:59:59.999 assign it the value two over here I 99:59:59.999 --> 99:59:59.999 assign a variable J of type int integer 99:59:59.999 --> 99:59:59.999 of value three can I assign I and J in 99:59:59.999 --> 99:59:59.999 Java cannot can in ogs definitely can 99:59:59.999 --> 99:59:59.999 bingo 99:59:59.999 --> 99:59:59.999 No let's see the error message some of 99:59:59.999 --> 99:59:59.999 you already guessed answer's no let's 99:59:59.999 --> 99:59:59.999 look at error message 99:59:59.999 --> 99:59:59.999 cannot use type J cannot use J type 99:59:59.999 --> 99:59:59.999 integer as type mine um so my num 99:59:59.999 --> 99:59:59.999 even though was derived from an integer 99:59:59.999 --> 99:59:59.999 is a separate typing goal so it is very 99:59:59.999 --> 99:59:59.999 very very strongly typed and this is 99:59:59.999 --> 99:59:59.999 very useful if you write big code if you 99:59:59.999 --> 99:59:59.999 write code that is shared with loads of 99:59:59.999 --> 99:59:59.999 programmers it's also very useful for 99:59:59.999 --> 99:59:59.999 code you have written years ago this is 99:59:59.999 --> 99:59:59.999 the equivalent of keeping everything in 99:59:59.999 --> 99:59:59.999 its right place and the right place for 99:59:59.999 --> 99:59:59.999 everything but there's always two sides 99:59:59.999 --> 99:59:59.999 to a coin keeping everything in the 99:59:59.999 --> 99:59:59.999 right place takes a lot of time a lot of 99:59:59.999 --> 99:59:59.999 bookkeeping nodejs 99:59:59.999 --> 99:59:59.999 allows you to throw things all the place 99:59:59.999 --> 99:59:59.999 a teenager's bedroom nodejs is like a 99:59:59.999 --> 99:59:59.999 teenager's bedroom go is like a 99:59:59.999 --> 99:59:59.999 well-kept well-groomed house so strong 99:59:59.999 --> 99:59:59.999 static typing allows you to catch most 99:59:59.999 --> 99:59:59.999 errors at compile time and the runtime 99:59:59.999 --> 99:59:59.999 is quite predictable in other words 99:59:59.999 --> 99:59:59.999 after compiling and you deploy 99:59:59.999 --> 99:59:59.999 production you can expect predictable 99:59:59.999 --> 99:59:59.999 performance but the flip side of it is 99:59:59.999 --> 99:59:59.999 if you are trying to throw a no-show to 99:59:59.999 --> 99:59:59.999 get a short script a language like 99:59:59.999 --> 99:59:59.999 nodejs Python or Ruby is much more 99:59:59.999 --> 99:59:59.999 appropriate so guess the message is what 99:59:59.999 --> 99:59:59.999 do you want to do what you already know 99:59:59.999 --> 99:59:59.999 and what you want to do in the future so 99:59:59.999 --> 99:59:59.999 decide whether you want to learn go let 99:59:59.999 --> 99:59:59.999 me try to convince you that go is worth 99:59:59.999 --> 99:59:59.999 learning so go has implicitly satisfied 99:59:59.999 --> 99:59:59.999 interfaces those come in from Java know 99:59:59.999 --> 99:59:59.999 about Java interfaces go tries to keep 99:59:59.999 --> 99:59:59.999 keeping a house in order 99:59:59.999 --> 99:59:59.999 static typing strong static typing more 99:59:59.999 --> 99:59:59.999 pleasant so over here I declare an 99:59:59.999 --> 99:59:59.999 interface type it's called one D fire 99:59:59.999 --> 99:59:59.999 and it's got one 99:59:59.999 --> 99:59:59.999 that in it called quantify and quantify 99:59:59.999 --> 99:59:59.999 it takes nothing and returns an integer 99:59:59.999 --> 99:59:59.999 so over here I declare another type my 99:59:59.999 --> 99:59:59.999 SDR or my string it's derived from type 99:59:59.999 --> 99:59:59.999 string and it also has a quantify method 99:59:59.999 --> 99:59:59.999 now how do I know there is a method this 99:59:59.999 --> 99:59:59.999 funny syntax which go created the way 99:59:59.999 --> 99:59:59.999 you read this line means quantify is a 99:59:59.999 --> 99:59:59.999 method of s of type my string which 99:59:59.999 --> 99:59:59.999 returns an integer that's how you read 99:59:59.999 --> 99:59:59.999 it so basically it's a matter of my 99:59:59.999 --> 99:59:59.999 string it says print that means printer 99:59:59.999 --> 99:59:59.999 screen quantifying s and was s its 99:59:59.999 --> 99:59:59.999 length of s it returns the length of s 99:59:59.999 --> 99:59:59.999 as the funny has a final value this is 99:59:59.999 --> 99:59:59.999 just a side effect you just print out 99:59:59.999 --> 99:59:59.999 the string now I declare another type 99:59:59.999 --> 99:59:59.999 called 99:59:59.999 --> 99:59:59.999 my int and it's derived from integer and 99:59:59.999 --> 99:59:59.999 to quantify this integer I did tell me 99:59:59.999 --> 99:59:59.999 whether it's positive negative or zero 99:59:59.999 --> 99:59:59.999 that simple code for that so let's cut 99:59:59.999 --> 99:59:59.999 to the chase 99:59:59.999 --> 99:59:59.999 well this code were let's go to line by 99:59:59.999 --> 99:59:59.999 line 99:59:59.999 --> 99:59:59.999 that's just a print statement this line 99:59:59.999 --> 99:59:59.999 is interesting 99:59:59.999 --> 99:59:59.999 oh by the way go has this funny reversed 99:59:59.999 --> 99:59:59.999 declaration syntax so a variable Q is of 99:59:59.999 --> 99:59:59.999 type quantifier that's why it means it 99:59:59.999 --> 99:59:59.999 is not quantifier is of type 2 it's the 99:59:59.999 --> 99:59:59.999 other way around so variable Q is of 99:59:59.999 --> 99:59:59.999 type quantifier so the quantifier has a 99:59:59.999 --> 99:59:59.999 quantified method Q equals my int 3 now 99:59:59.999 --> 99:59:59.999 that's another funny go Lang go language 99:59:59.999 --> 99:59:59.999 syntax all he's saying is victory and 99:59:59.999 --> 99:59:59.999 make it my it so I'm casting 3 to my end 99:59:59.999 --> 99:59:59.999 think of it like a constructor in Java 99:59:59.999 --> 99:59:59.999 so that's a constructor kind of thing 99:59:59.999 --> 99:59:59.999 print queue 25 so 3 is a numeric it's 99:59:59.999 --> 99:59:59.999 positive so should be 1 I guess so 99:59:59.999 --> 99:59:59.999 Q equals my string ABC and the length of 99:59:59.999 --> 99:59:59.999 ABC is 3 so we run this program the 99:59:59.999 --> 99:59:59.999 first one should be 1 the second one 99:59:59.999 --> 99:59:59.999 should be 3 let's check it out and sure 99:59:59.999 --> 99:59:59.999 enough it is 1 in 3 now 99:59:59.999 --> 99:59:59.999 let me edit my presentation and rerun it 99:59:59.999 --> 99:59:59.999 anybody learn how to edit your 99:59:59.999 --> 99:59:59.999 presentation and rerun it let's change 99:59:59.999 --> 99:59:59.999 this to a minus four let's editing my 99:59:59.999 --> 99:59:59.999 presentation this is written in go by 99:59:59.999 --> 99:59:59.999 the week 99:59:59.999 --> 99:59:59.999 real cool stuff and let's run it again 99:59:59.999 --> 99:59:59.999 so now it shows up as minus one can 99:59:59.999 --> 99:59:59.999 everybody at a backseater bottom rows 99:59:59.999 --> 99:59:59.999 good now no surprise if I change it to 99:59:59.999 --> 99:59:59.999 zero it should be zero let's run it and 99:59:59.999 --> 99:59:59.999 it shows up as zero if I change this to 99:59:59.999 --> 99:59:59.999 a four letter word maybe a five letter 99:59:59.999 --> 99:59:59.999 word it just returns the length of the 99:59:59.999 --> 99:59:59.999 string now I'm going to show you goes 99:59:59.999 --> 99:59:59.999 see you routes anybody know see here 99:59:59.999 --> 99:59:59.999 good what do you think will happen here 99:59:59.999 --> 99:59:59.999 0x20 a see that's a hexadecimal number 99:59:59.999 --> 99:59:59.999 what do you think what happened you 99:59:59.999 --> 99:59:59.999 volunteers shout out your answer really 99:59:59.999 --> 99:59:59.999 will one character well let's try it on 99:59:59.999 --> 99:59:59.999 quantifying euro 0x20 AC is the Unicode 99:59:59.999 --> 99:59:59.999 for Euro the Euro symbol and the Euro 99:59:59.999 --> 99:59:59.999 symbol is a single character string and 99:59:59.999 --> 99:59:59.999 it says 3 because the signal character 99:59:59.999 --> 99:59:59.999 string is actually an integer and it's 99:59:59.999 --> 99:59:59.999 of length 3 really confusing stuff but 99:59:59.999 --> 99:59:59.999 here are the things they will trip you 99:59:59.999 --> 99:59:59.999 up it's sea routes 99:59:59.999 --> 99:59:59.999 alright why is this useful why are these 99:59:59.999 --> 99:59:59.999 car interfaces useful now let's say I 99:59:59.999 --> 99:59:59.999 have another type call exam paper and 99:59:59.999 --> 99:59:59.999 exam paper you submitted it as Syrian 99:59:59.999 --> 99:59:59.999 Dom I shouldn't use Microsoft should use 99:59:59.999 --> 99:59:59.999 Google stuff anyway that's the URL for 99:59:59.999 --> 99:59:59.999 my exam paper submission and let's say 99:59:59.999 --> 99:59:59.999 exam paper is to create me quantify how 99:59:59.999 --> 99:59:59.999 do you test this car stuff it's 99:59:59.999 --> 99:59:59.999 difficult right it's gonna make a 99:59:59.999 --> 99:59:59.999 service call go out to the Internet 99:59:59.999 --> 99:59:59.999 grab the real exam paper and try to test 99:59:59.999 --> 99:59:59.999 it and that's not very predictable the 99:59:59.999 --> 99:59:59.999 internet connection may be down I may 99:59:59.999 --> 99:59:59.999 have changed my exam my exam submission 99:59:59.999 --> 99:59:59.999 but I can have fake exam paper to HTTP 99:59:59.999 --> 99:59:59.999 does not matter dot see you in the doc 99:59:59.999 --> 99:59:59.999 it never makes the internet call but 99:59:59.999 --> 99:59:59.999 fake exam paper because it 99:59:59.999 --> 99:59:59.999 satisfies quantify it works and it's 99:59:59.999 --> 99:59:59.999 great for testing so this is how I use 99:59:59.999 --> 99:59:59.999 interfaces all the time but this way of 99:59:59.999 --> 99:59:59.999 defining interfaces is very very useful 99:59:59.999 --> 99:59:59.999 because in Java or similar languages you 99:59:59.999 --> 99:59:59.999 must say this class implements this and 99:59:59.999 --> 99:59:59.999 you may find that the implements may be 99:59:59.999 --> 99:59:59.999 implements ABCD efg until Zach a very 99:59:59.999 --> 99:59:59.999 very long string of implements in go 99:59:59.999 --> 99:59:59.999 there is no implements cuit it's 99:59:59.999 --> 99:59:59.999 implicit implementation so long as it's 99:59:59.999 --> 99:59:59.999 got a quantifier method it works the 99:59:59.999 --> 99:59:59.999 most fantastic example of this is IO 99:59:59.999 --> 99:59:59.999 reader and IO writer you can print line 99:59:59.999 --> 99:59:59.999 to a database because it I all right I 99:59:59.999 --> 99:59:59.999 will read ok so that is the second 99:59:59.999 --> 99:59:59.999 reason why go is such a good language if 99:59:59.999 --> 99:59:59.999 I'm losing any of you if you want us any 99:59:59.999 --> 99:59:59.999 questions just shout out interrupt me 99:59:59.999 --> 99:59:59.999 yes 99:59:59.999 --> 99:59:59.999 so Java has if you have a functional 99:59:59.999 --> 99:59:59.999 interface yeah Java it onwards has 99:59:59.999 --> 99:59:59.999 function interfaces and the question is 99:59:59.999 --> 99:59:59.999 if you use the functional interface of 99:59:59.999 --> 99:59:59.999 Java you have this kind of capability 99:59:59.999 --> 99:59:59.999 sort of right and how is it different 99:59:59.999 --> 99:59:59.999 from the Java interface well I like to 99:59:59.999 --> 99:59:59.999 think go start the refers Java copied it 99:59:59.999 --> 99:59:59.999 but here that's actually a very good 99:59:59.999 --> 99:59:59.999 question 99:59:59.999 --> 99:59:59.999 go JavaScript and I'm sorry 99:59:59.999 --> 99:59:59.999 leave go office JavaScript nodejs Java 99:59:59.999 --> 99:59:59.999 Kotlin all the new modern languages if 99:59:59.999 --> 99:59:59.999 you hear one of the authors of go speak 99:59:59.999 --> 99:59:59.999 his name is Robert by interesting 99:59:59.999 --> 99:59:59.999 speaker he says all these languages are 99:59:59.999 --> 99:59:59.999 becoming more and more alike they're 99:59:59.999 --> 99:59:59.999 getting more and more features Java is 99:59:59.999 --> 99:59:59.999 getting functional features node.js is 99:59:59.999 --> 99:59:59.999 trying to get classes so all these 99:59:59.999 --> 99:59:59.999 languages are converging more or less 99:59:59.999 --> 99:59:59.999 the same language perhaps it differs 99:59:59.999 --> 99:59:59.999 slightly different syntax who is 99:59:59.999 --> 99:59:59.999 different go is very very limited I'd 99:59:59.999 --> 99:59:59.999 want to use this word but it is quite 99:59:59.999 --> 99:59:59.999 relevant limited stupid basic language 99:59:59.999 --> 99:59:59.999 it is designed so that anybody coming 99:59:59.999 --> 99:59:59.999 from a C language can look at it and 99:59:59.999 --> 99:59:59.999 solve kind of understand it it's 99:59:59.999 --> 99:59:59.999 designed so that you can write code that 99:59:59.999 --> 99:59:59.999 is efficient that compiles quickly and 99:59:59.999 --> 99:59:59.999 when you look at here five years later 99:59:59.999 --> 99:59:59.999 you can still understand it so goal is 99:59:59.999 --> 99:59:59.999 designed somewhat like Python what 99:59:59.999 --> 99:59:59.999 design Python was designed to be clear 99:59:59.999 --> 99:59:59.999 and easily readable so many people have 99:59:59.999 --> 99:59:59.999 actually come from Python to go 99:59:59.999 --> 99:59:59.999 why because Python is really slow global 99:59:59.999 --> 99:59:59.999 interpreter lock 99:59:59.999 --> 99:59:59.999 I came to go not from Python but from 99:59:59.999 --> 99:59:59.999 Ruby the rubies are fantastic language 99:59:59.999 --> 99:59:59.999 it makes developers like me who write in 99:59:59.999 --> 99:59:59.999 Ruby very happy it's a very very fun 99:59:59.999 --> 99:59:59.999 language but but but yes group global 99:59:59.999 --> 99:59:59.999 interpreter lock it's really slow but 99:59:59.999 --> 99:59:59.999 that wasn't my issue it was fast enough 99:59:59.999 --> 99:59:59.999 Ruby was fast enough for me but Ruby 99:59:59.999 --> 99:59:59.999 code because it was so fun to write when 99:59:59.999 --> 99:59:59.999 you look at it five years later what am 99:59:59.999 --> 99:59:59.999 I trying to write here go tries to 99:59:59.999 --> 99:59:59.999 circumvent that problem by anyway let's 99:59:59.999 --> 99:59:59.999 go to goes the feature which I want to 99:59:59.999 --> 99:59:59.999 talk about which is concurrency which is 99:59:59.999 --> 99:59:59.999 something which for a person new to 99:59:59.999 --> 99:59:59.999 programming finds it really hard and for 99:59:59.999 --> 99:59:59.999 person who does JavaScript finds it 99:59:59.999 --> 99:59:59.999 quite hard as well so over here I 99:59:59.999 --> 99:59:59.999 declare a function let's call plus and 99:59:59.999 --> 99:59:59.999 all it does for event however prints 99:59:59.999 --> 99:59:59.999 the plus sign that's all it does after 99:59:59.999 --> 99:59:59.999 one second it Blin prints another plus 99:59:59.999 --> 99:59:59.999 forever and ever 99:59:59.999 --> 99:59:59.999 here we have basically the same routine 99:59:59.999 --> 99:59:59.999 but it brings out a period brings out a 99:59:59.999 --> 99:59:59.999 dot okay 99:59:59.999 --> 99:59:59.999 most of us when we start out writing 99:59:59.999 --> 99:59:59.999 code we write code like this this this 99:59:59.999 --> 99:59:59.999 one compiled so 99:59:59.999 --> 99:59:59.999 let's run it like this this one compiled 99:59:59.999 --> 99:59:59.999 it all it's got some real error message 99:59:59.999 --> 99:59:59.999 about to execute select so I'm about to 99:59:59.999 --> 99:59:59.999 execute select fatal all goroutines are 99:59:59.999 --> 99:59:59.999 sleep deadlock which means there is 99:59:59.999 --> 99:59:59.999 something in NGO called a goroutine and 99:59:59.999 --> 99:59:59.999 his detected deadlock and its crash the 99:59:59.999 --> 99:59:59.999 program and it's exited so okay let's 99:59:59.999 --> 99:59:59.999 make the program work 99:59:59.999 --> 99:59:59.999 let's fix me ok let's run + let's run 99:59:59.999 --> 99:59:59.999 this program ok pluses are running but 99:59:59.999 --> 99:59:59.999 my aim is to run + and go at the same 99:59:59.999 --> 99:59:59.999 time concurrently so as a beginner 99:59:59.999 --> 99:59:59.999 programmer I would do that of course 99:59:59.999 --> 99:59:59.999 do you think that will never work 99:59:59.999 --> 99:59:59.999 no why 99:59:59.999 --> 99:59:59.999 a sequential execution plus is holding 99:59:59.999 --> 99:59:59.999 on to the CPU I just want to let go 99:59:59.999 --> 99:59:59.999 let's prove it yes plus is hogging the 99:59:59.999 --> 99:59:59.999 CPU doesn't want to let go it doesn't 99:59:59.999 --> 99:59:59.999 let go any time to run it all okay I am 99:59:59.999 --> 99:59:59.999 the creator I'm the right of this 99:59:59.999 --> 99:59:59.999 program now dot can run correct yeah 99:59:59.999 --> 99:59:59.999 don't runs by one go and plus and dot to 99:59:59.999 --> 99:59:59.999 run at the same time how do I do that 99:59:59.999 --> 99:59:59.999 anybody we got go experts here come on 99:59:59.999 --> 99:59:59.999 ah yes the goalkeeper do ah start a go 99:59:59.999 --> 99:59:59.999 routine let's do that 99:59:59.999 --> 99:59:59.999 I added three characters g/o and a space 99:59:59.999 --> 99:59:59.999 and I've turned a regular routine into a 99:59:59.999 --> 99:59:59.999 go routine in the routine that doesn't 99:59:59.999 --> 99:59:59.999 block let's prove it hey it doesn't 99:59:59.999 --> 99:59:59.999 block it works but hold on this part the 99:59:59.999 --> 99:59:59.999 code is not executing this particle 99:59:59.999 --> 99:59:59.999 which says about to execute select is 99:59:59.999 --> 99:59:59.999 not executing how do I get that to 99:59:59.999 --> 99:59:59.999 execute as well 99:59:59.999 --> 99:59:59.999 oh you guys are learning fast 99:59:59.999 --> 99:59:59.999 put another make dot a go routine so 99:59:59.999 --> 99:59:59.999 let's do that 99:59:59.999 --> 99:59:59.999 bang now there's something interesting 99:59:59.999 --> 99:59:59.999 here this comes from printing lying go 99:59:59.999 --> 99:59:59.999 concurrency this comes from about to 99:59:59.999 --> 99:59:59.999 execute select and then the pluses and 99:59:59.999 --> 99:59:59.999 dots what is actually happened here is 99:59:59.999 --> 99:59:59.999 the program ran put that into the 99:59:59.999 --> 99:59:59.999 background it's running independently in 99:59:59.999 --> 99:59:59.999 the background put that in a background 99:59:59.999 --> 99:59:59.999 that took a few hundred microseconds 99:59:59.999 --> 99:59:59.999 fraction of a millisecond so in a 99:59:59.999 --> 99:59:59.999 fraction of a millisecond or maybe a 99:59:59.999 --> 99:59:59.999 millisecond later the print line 99:59:59.999 --> 99:59:59.999 executed and I needed to put this select 99:59:59.999 --> 99:59:59.999 here select here select is a statement 99:59:59.999 --> 99:59:59.999 which actually tries to determine which 99:59:59.999 --> 99:59:59.999 grow routine is ready to run but if I 99:59:59.999 --> 99:59:59.999 remove that select if I remove the wait 99:59:59.999 --> 99:59:59.999 forever what do you think will happen 99:59:59.999 --> 99:59:59.999 the program would actually the program 99:59:59.999 --> 99:59:59.999 would terminate 99:59:59.999 --> 99:59:59.999 what happened to my goal routines if 99:59:59.999 --> 99:59:59.999 main terminates the core routines 99:59:59.999 --> 99:59:59.999 dominate let's prove that 99:59:59.999 --> 99:59:59.999 so no more select it's commented out and 99:59:59.999 --> 99:59:59.999 by the way the double slash if you've 99:59:59.999 --> 99:59:59.999 not figured it out its comment 99:59:59.999 --> 99:59:59.999 program exited no dots no plus so that's 99:59:59.999 --> 99:59:59.999 another feature of go 99:59:59.999 --> 99:59:59.999 it has garbage collected the goal 99:59:59.999 --> 99:59:59.999 routines goal is a garbage collector 99:59:59.999 --> 99:59:59.999 language with a very very very 99:59:59.999 --> 99:59:59.999 performant garbage collector those 99:59:59.999 --> 99:59:59.999 people coming from Java every now and 99:59:59.999 --> 99:59:59.999 then when the garbage collector collects 99:59:59.999 --> 99:59:59.999 garbage it stops the world the whole 99:59:59.999 --> 99:59:59.999 system stops go garbage collector used 99:59:59.999 --> 99:59:59.999 to be like that as well stop the world 99:59:59.999 --> 99:59:59.999 for a few hundred milliseconds the 99:59:59.999 --> 99:59:59.999 latest version or go stops the world for 99:59:59.999 --> 99:59:59.999 a few hundred microseconds so it doesn't 99:59:59.999 --> 99:59:59.999 really stop the world alright 99:59:59.999 --> 99:59:59.999 those people who know JavaScript will 99:59:59.999 --> 99:59:59.999 know no js' that's nothing new 99:59:59.999 --> 99:59:59.999 no Jas has concurrency as well so let's 99:59:59.999 --> 99:59:59.999 prove it I'll put it here 99:59:59.999 --> 99:59:59.999 f12 to get console 99:59:59.999 --> 99:59:59.999 so over here I've defined two JavaScript 99:59:59.999 --> 99:59:59.999 functions function plus and function dot 99:59:59.999 --> 99:59:59.999 and this is very JavaScript every 1000 99:59:59.999 --> 99:59:59.999 milliseconds lakh to the console a plus 99:59:59.999 --> 99:59:59.999 every 1000 milliseconds log to the 99:59:59.999 --> 99:59:59.999 console a - no - a dot so when I run 99:59:59.999 --> 99:59:59.999 that well pluses go on to pluses four 99:59:59.999 --> 99:59:59.999 pluses five pluses go on and on 99:59:59.999 --> 99:59:59.999 if I run dot if I can type 99:59:59.999 --> 99:59:59.999 now you got plus and dot's so javascript 99:59:59.999 --> 99:59:59.999 can do what go to us mind budget if you 99:59:59.999 --> 99:59:59.999 know JavaScript do you want to learn go 99:59:59.999 --> 99:59:59.999 okay was it the same sort of sort of the 99:59:59.999 --> 99:59:59.999 same what I just did in my in my web 99:59:59.999 --> 99:59:59.999 browser was I made use of a web worker 99:59:59.999 --> 99:59:59.999 which will consume this is roughly 99:59:59.999 --> 99:59:59.999 equivalent to one java thread which is 99:59:59.999 --> 99:59:59.999 roughly equivalent to one operating 99:59:59.999 --> 99:59:59.999 system-level thread so if my computer 99:59:59.999 --> 99:59:59.999 has four cores it can run four threats 99:59:59.999 --> 99:59:59.999 at the same time at the same time you 99:59:59.999 --> 99:59:59.999 can have many many threads like an when 99:59:59.999 --> 99:59:59.999 you run for them at the same time a go 99:59:59.999 --> 99:59:59.999 routine is not blind the JavaScript web 99:59:59.999 --> 99:59:59.999 worker know a goroutine well a million 99:59:59.999 --> 99:59:59.999 go routines can share one thread 99:59:59.999 --> 99:59:59.999 somebody actually did a demo a million 99:59:59.999 --> 99:59:59.999 go routine share one thread so it's a 99:59:59.999 --> 99:59:59.999 very simple very lightweight go routine 99:59:59.999 --> 99:59:59.999 almost does nothing but still a million 99:59:59.999 --> 99:59:59.999 go routines can say one thread and on a 99:59:59.999 --> 99:59:59.999 fork or machine you get four million go 99:59:59.999 --> 99:59:59.999 routines so the next point I'll make is 99:59:59.999 --> 99:59:59.999 ah after Java II guess guess who the 99:59:59.999 --> 99:59:59.999 coffee 99:59:59.999 --> 99:59:59.999 guess who do you copy the coffee go the 99:59:59.999 --> 99:59:59.999 ideas are very old the ideas are very 99:59:59.999 --> 99:59:59.999 very old right goroutine is actually not 99:59:59.999 --> 99:59:59.999 the correct word to use it's correct in 99:59:59.999 --> 99:59:59.999 go by it came from paper called 99:59:59.999 --> 99:59:59.999 concurrently concurrent sequential 99:59:59.999 --> 99:59:59.999 processes it's called co-routines 99:59:59.999 --> 99:59:59.999 spelled with a c' nobody paid attention 99:59:59.999 --> 99:59:59.999 to co-routines except for the line for a 99:59:59.999 --> 99:59:59.999 long long time 99:59:59.999 --> 99:59:59.999 right then goal came out and say 99:59:59.999 --> 99:59:59.999 co-routines are cool and I'm gonna brand 99:59:59.999 --> 99:59:59.999 them goroutines and then everybody 99:59:59.999 --> 99:59:59.999 started saying hmm Cortland once it as 99:59:59.999 --> 99:59:59.999 well 99:59:59.999 --> 99:59:59.999 Java wants it as well so all these 99:59:59.999 --> 99:59:59.999 languages are becoming known as the same 99:59:59.999 --> 99:59:59.999 language with different syntax they're 99:59:59.999 --> 99:59:59.999 getting features before coming to go yes 99:59:59.999 --> 99:59:59.999 Rudy as a Jordi no I programmed in Java 99:59:59.999 --> 99:59:59.999 and I was looking for better Java so I 99:59:59.999 --> 99:59:59.999 thought Scala is good 99:59:59.999 --> 99:59:59.999 Scala is an extremely powerful language 99:59:59.999 --> 99:59:59.999 don't get me wrong it can do everything 99:59:59.999 --> 99:59:59.999 you can write dsls domain-specific 99:59:59.999 --> 99:59:59.999 languages in Java it is so big that I 99:59:59.999 --> 99:59:59.999 can't read my code after one week I can 99:59:59.999 --> 99:59:59.999 be so undisciplined there I cannot read 99:59:59.999 --> 99:59:59.999 my own code after one week that is color 99:59:59.999 --> 99:59:59.999 anyway 99:59:59.999 --> 99:59:59.999 how good is gos concurrency that's 99:59:59.999 --> 99:59:59.999 that's another thing I want to highlight 99:59:59.999 --> 99:59:59.999 about goal is course concurrency good go 99:59:59.999 --> 99:59:59.999 is design the birthplace of goal was 99:59:59.999 --> 99:59:59.999 actually Google we are at its birthplace 99:59:59.999 --> 99:59:59.999 the organization not here but 99:59:59.999 --> 99:59:59.999 organization and goal was invented the 99:59:59.999 --> 99:59:59.999 story goes when you're trying to compile 99:59:59.999 --> 99:59:59.999 a big C++ program that big C++ program 99:59:59.999 --> 99:59:59.999 took about 40 minutes to compile they 99:59:59.999 --> 99:59:59.999 compile the equivalent program in go and 99:59:59.999 --> 99:59:59.999 it took less than a minute few seconds 99:59:59.999 --> 99:59:59.999 but compiled time is one thing how 99:59:59.999 --> 99:59:59.999 performin is it this is a whole web 99:59:59.999 --> 99:59:59.999 browser in go now those people working 99:59:59.999 --> 99:59:59.999 in no job no GSA say I can have Express 99:59:59.999 --> 99:59:59.999 and I can write a similarly short web 99:59:59.999 --> 99:59:59.999 browser in three lines or four lines or 99:59:59.999 --> 99:59:59.999 two lines 99:59:59.999 --> 99:59:59.999 let's besides the point the point is can 99:59:59.999 --> 99:59:59.999 no GS perform on my really crappy laptop 99:59:59.999 --> 99:59:59.999 11,000 requests per second with almost 99:59:59.999 --> 99:59:59.999 no optimization well go optimization 99:59:59.999 --> 99:59:59.999 compared with nginx same laptop running 99:59:59.999 --> 99:59:59.999 a static website all it does is serve 99:59:59.999 --> 99:59:59.999 hello well it came out with about the 99:59:59.999 --> 99:59:59.999 same 10,000 requests per second 11,000 99:59:59.999 --> 99:59:59.999 requests the second it's within the 99:59:59.999 --> 99:59:59.999 arrow pens right what I'm trying to say 99:59:59.999 --> 99:59:59.999 here is for beginner who knows nothing 99:59:59.999 --> 99:59:59.999 about OS tuning who knows nothing about 99:59:59.999 --> 99:59:59.999 concurrency you can write code that's 99:59:59.999 --> 99:59:59.999 production-ready 99:59:59.999 --> 99:59:59.999 as good as engineer 99:59:59.999 --> 99:59:59.999 so goal is designed for heavy-duty 99:59:59.999 --> 99:59:59.999 back-end service production-ready 99:59:59.999 --> 99:59:59.999 back-end service a really good really 99:59:59.999 --> 99:59:59.999 performant easy to read easy to extend 99:59:59.999 --> 99:59:59.999 back-end service and my favorite feature 99:59:59.999 --> 99:59:59.999 of all Java done right if you use pure 99:59:59.999 --> 99:59:59.999 go in other words you don't link against 99:59:59.999 --> 99:59:59.999 the C library you can link go against a 99:59:59.999 --> 99:59:59.999 CLI breathe that's called C go if we 99:59:59.999 --> 99:59:59.999 don't use Seco or use Windows specific 99:59:59.999 --> 99:59:59.999 dll's or Mac specific libraries you can 99:59:59.999 --> 99:59:59.999 all you need to do to cross compile the 99:59:59.999 --> 99:59:59.999 Gnostic oh you go enable equals zero 99:59:59.999 --> 99:59:59.999 turn off Seco specify an operating 99:59:59.999 --> 99:59:59.999 system windows I've got clients that 99:59:59.999 --> 99:59:59.999 insist on using Windows what they do no 99:59:59.999 --> 99:59:59.999 near windows old windows 386 windows now 99:59:59.999 --> 99:59:59.999 x64 go Buell hello well it generates an 99:59:59.999 --> 99:59:59.999 exe file a windows 386 exe file let's 99:59:59.999 --> 99:59:59.999 look at the complete list 99:59:59.999 --> 99:59:59.999 Hayek's 99:59:59.999 --> 99:59:59.999 Wow Android Darwyn what's dragonfly 99:59:59.999 --> 99:59:59.999 don't know what dragonfly is FreeBSD 99:59:59.999 --> 99:59:59.999 some funny always called illumos I don't 99:59:59.999 --> 99:59:59.999 know about it 99:59:59.999 --> 99:59:59.999 ah this is really really really 99:59:59.999 --> 99:59:59.999 interesting javascript was a web 99:59:59.999 --> 99:59:59.999 assembly yes cool can compile to the 99:59:59.999 --> 99:59:59.999 JavaScript web assembly binaries and 99:59:59.999 --> 99:59:59.999 these people are using it because they 99:59:59.999 --> 99:59:59.999 want to play games on the web browser 99:59:59.999 --> 99:59:59.999 and go a so performin they put a whole 99:59:59.999 --> 99:59:59.999 game engine in the web assembly with 99:59:59.999 --> 99:59:59.999 with physics and everything in there 99:59:59.999 --> 99:59:59.999 nice target before go is just another 99:59:59.999 --> 99:59:59.999 target it targets all these platforms my 99:59:59.999 --> 99:59:59.999 platform happens be Linux AMD 64 so 99:59:59.999 --> 99:59:59.999 let's go back another presentation 99:59:59.999 --> 99:59:59.999 if you won a coat download the whole 99:59:59.999 --> 99:59:59.999 presentation download its there soohyun 99:59:59.999 --> 99:59:59.999 github lots of other presentations there 99:59:59.999 --> 99:59:59.999 as well but this one is there and you 99:59:59.999 --> 99:59:59.999 can run your presentation like I ran my 99:59:59.999 --> 99:59:59.999 presentation thanks for listening thank 99:59:59.999 --> 99:59:59.999 you questions comments flamewars yes 99:59:59.999 --> 99:59:59.999 okay the question was usually 99:59:59.999 --> 99:59:59.999 machine-learning folks used something 99:59:59.999 --> 99:59:59.999 like Python and Python is a fantastic 99:59:59.999 --> 99:59:59.999 language for machine learning because 99:59:59.999 --> 99:59:59.999 Python was written by dude over in 99:59:59.999 --> 99:59:59.999 Russell my pronouncing that name all 99:59:59.999 --> 99:59:59.999 wrong 99:59:59.999 --> 99:59:59.999 he's a mathematics professor so before 99:59:59.999 --> 99:59:59.999 tensorflow came out you had numpy and 99:59:59.999 --> 99:59:59.999 Python was an absolutely great language 99:59:59.999 --> 99:59:59.999 in that area go is not it's not a 99:59:59.999 --> 99:59:59.999 machine language optimized language is 99:59:59.999 --> 99:59:59.999 the wrong tool to use go for machine 99:59:59.999 --> 99:59:59.999 language but go is very very good for 99:59:59.999 --> 99:59:59.999 data engineering before you can do 99:59:59.999 --> 99:59:59.999 machine learning you need to get your 99:59:59.999 --> 99:59:59.999 data in shape you need to clean your 99:59:59.999 --> 99:59:59.999 data so go has data flow libraries which 99:59:59.999 --> 99:59:59.999 can clean up massive amounts of data 99:59:59.999 --> 99:59:59.999 really quickly but not the actual 99:59:59.999 --> 99:59:59.999 machine learning itself any other 99:59:59.999 --> 99:59:59.999 questions comments reactions you like go 99:59:59.999 --> 99:59:59.999 is it worth learning yes okay my friend 99:59:59.999 --> 99:59:59.999 here has a difficult question for me he 99:59:59.999 --> 99:59:59.999 promised me a difficult question doesn't 99:59:59.999 --> 99:59:59.999 matter repeat your question yes 99:59:59.999 --> 99:59:59.999 [Music] 99:59:59.999 --> 99:59:59.999 okay okay I guess I guess you can 99:59:59.999 --> 99:59:59.999 summarize the question is summarized the 99:59:59.999 --> 99:59:59.999 question is can you share pine can you 99:59:59.999 --> 99:59:59.999 share memory effectively if you got 99:59:59.999 --> 99:59:59.999 sixty instances of the same thing can 99:59:59.999 --> 99:59:59.999 you share memory sort of kind of it will 99:59:59.999 --> 99:59:59.999 eat up it will be 60 times the memory 99:59:59.999 --> 99:59:59.999 okay 99:59:59.999 --> 99:59:59.999 so let's answer actually is a very very 99:59:59.999 --> 99:59:59.999 good question 99:59:59.999 --> 99:59:59.999 let me attack let me attack the first 99:59:59.999 --> 99:59:59.999 question first let me address the first 99:59:59.999 --> 99:59:59.999 question first go binaries can get 99:59:59.999 --> 99:59:59.999 pretty big pretty fast that hello world 99:59:59.999 --> 99:59:59.999 was about one to two megabytes why is it 99:59:59.999 --> 99:59:59.999 so big why is a hello world almost two 99:59:59.999 --> 99:59:59.999 megabytes 99:59:59.999 --> 99:59:59.999 yes when you write a Java class 99:59:59.999 --> 99:59:59.999 HelloWorld in Java class and the class 99:59:59.999 --> 99:59:59.999 file is a few hundred bytes a go 99:59:59.999 --> 99:59:59.999 executable is a few megabytes almost two 99:59:59.999 --> 99:59:59.999 megabytes but the Java file can run on 99:59:59.999 --> 99:59:59.999 its own you need the JVM which is 50 99:59:59.999 --> 99:59:59.999 megabytes or more the last time I 99:59:59.999 --> 99:59:59.999 checked the entire JVM for go the entire 99:59:59.999 --> 99:59:59.999 go runtime is embedded in the binary the 99:59:59.999 --> 99:59:59.999 entire go runtime the handles go 99:59:59.999 --> 99:59:59.999 routines the entire go runtime that does 99:59:59.999 --> 99:59:59.999 all this smart implicit interfaces 99:59:59.999 --> 99:59:59.999 entire go runtime that does strong 99:59:59.999 --> 99:59:59.999 static types is embedded in that one or 99:59:59.999 --> 99:59:59.999 two megabytes in the hello world so most 99:59:59.999 --> 99:59:59.999 go binaries are self-contained most HTTP 99:59:59.999 --> 99:59:59.999 is not self-contained but you can make 99:59:59.999 --> 99:59:59.999 it self-contained and can make a pure 99:59:59.999 --> 99:59:59.999 coding net HTTP or the net library 99:59:59.999 --> 99:59:59.999 actually makes use of the operating 99:59:59.999 --> 99:59:59.999 systems resolver library which means 99:59:59.999 --> 99:59:59.999 it's a time I'm a clear link library and 99:59:59.999 --> 99:59:59.999 many pure go operas don't like it so 99:59:59.999 --> 99:59:59.999 they turn off see go and you can produce 99:59:59.999 --> 99:59:59.999 a pure goal binary and that consumes 99:59:59.999 --> 99:59:59.999 maybe about five megabytes to eight 99:59:59.999 --> 99:59:59.999 megabytes the entire web browser 99:59:59.999 --> 99:59:59.999 resolver stack so that's why gold 99:59:59.999 --> 99:59:59.999 binaries can get big quite fast the 99:59:59.999 --> 99:59:59.999 entire docker binary was written in go 99:59:59.999 --> 99:59:59.999 and it's about fifty megabytes I think 99:59:59.999 --> 99:59:59.999 right so really really huge projects 99:59:59.999 --> 99:59:59.999 like docker kubernetes cube control cube 99:59:59.999 --> 99:59:59.999 CTL they win roughly tens of megabytes 99:59:59.999 --> 99:59:59.999 when you deploy a goal binary in a 99:59:59.999 --> 99:59:59.999 docker container I don't use Alpine 99:59:59.999 --> 99:59:59.999 because I guess I just used from scratch 99:59:59.999 --> 99:59:59.999 in docker terms from scratch means start 99:59:59.999 --> 99:59:59.999 with an empty container empty docker 99:59:59.999 --> 99:59:59.999 container and in my go binary is five 99:59:59.999 --> 99:59:59.999 megabytes my docker containers five 99:59:59.999 --> 99:59:59.999 megabytes really tiny docker containers 99:59:59.999 --> 99:59:59.999 so the mantra for goal is don't 99:59:59.999 --> 99:59:59.999 communicate by sharing memory right 99:59:59.999 --> 99:59:59.999 don't communicate by sharing memory 99:59:59.999 --> 99:59:59.999 share memory by communicating so 99:59:59.999 --> 99:59:59.999 everything in goal is independent and 99:59:59.999 --> 99:59:59.999 unshared non share you communicate 99:59:59.999 --> 99:59:59.999 across different processes using 99:59:59.999 --> 99:59:59.999 channels any other comments questions 99:59:59.999 --> 99:59:59.999 reactions if not I think Xiao Zhang yes 99:59:59.999 --> 99:59:59.999 yes I've used a patch a benchmark to 99:59:59.999 --> 99:59:59.999 test the let me repeat the question for 99:59:59.999 --> 99:59:59.999 the audience the question was is go now 99:59:59.999 --> 99:59:59.999 because that hello world was static 99:59:59.999 --> 99:59:59.999 content static web browsers everybody 99:59:59.999 --> 99:59:59.999 knows it's blazingly fast right any any 99:59:59.999 --> 99:59:59.999 person can write a fast static web 99:59:59.999 --> 99:59:59.999 browser the question was is go the right 99:59:59.999 --> 99:59:59.999 tool for IO intensive dynamic content 99:59:59.999 --> 99:59:59.999 and absolutely that's the purpose of 99:59:59.999 --> 99:59:59.999 goal it's designed to have very very 99:59:59.999 --> 99:59:59.999 fast io intensive stuff if if everything 99:59:59.999 --> 99:59:59.999 is compute intensive like video encoding 99:59:59.999 --> 99:59:59.999 go will not be very effective because 99:59:59.999 --> 99:59:59.999 the compute or CPU resource hungry 99:59:59.999 --> 99:59:59.999 process will grab the CPU but if it is 99:59:59.999 --> 99:59:59.999 IO intensive go is the perfect fit much 99:59:59.999 --> 99:59:59.999 much much better than no GS know GS 99:59:59.999 --> 99:59:59.999 rocked the world because it multiplexed 99:59:59.999 --> 99:59:59.999 a lot of i/o intensive process 99:59:59.999 --> 99:59:59.999 on two one thread go multiplex the same 99:59:59.999 --> 99:59:59.999 thing actually cause some copy no GS in 99:59:59.999 --> 99:59:59.999 their sense but knock not one trip on 99:59:59.999 --> 99:59:59.999 all available threads if you have a 64 99:59:59.999 --> 99:59:59.999 core CPU 64 processes can be called the 99:59:59.999 --> 99:59:59.999 task versus one process in no js' and 99:59:59.999 --> 99:59:59.999 yet that yes ok take two days 99:59:59.999 --> 99:59:59.999 I'll just because need ok 99:59:59.999 --> 99:59:59.999 go good for writing back in service 99:59:59.999 --> 99:59:59.999 . go is fantastic for writing back-end 99:59:59.999 --> 99:59:59.999 service second question is cool 99:59:59.999 --> 99:59:59.999 resource-hungry does go require a lot of 99:59:59.999 --> 99:59:59.999 resources like Java for example in the 99:59:59.999 --> 99:59:59.999 answer is no go is very very efficient 99:59:59.999 --> 99:59:59.999 next to see in terms of efficiency if C 99:59:59.999 --> 99:59:59.999 was the ghost and there is one it uses 99:59:59.999 --> 99:59:59.999 100% go would use maybe of 110% maybe 99:59:59.999 --> 99:59:59.999 hundred five percent so it is very very 99:59:59.999 --> 99:59:59.999 resource efficient thank you 99:59:59.999 --> 99:59:59.999 [Applause]