Firstly - I've worked with (indeed I used to be) a programmer that learned through doing. As such, I've categorised such people into two groups: - those that give a shit about getting better, and those that don't. You appear to be in the first category, which is by far the better and much less dangerous of the two.
About ten years ago now, I decided that I'd had enough of meetings in which I'd have to muddle through and make answers up as I went along, so I went back to University and got a Masters in Computing; my undergrad degree was in English - then I got sucked into programming via HTML, then JavaScript, then "classic" ASP etc - as I say - it all kind of snowballed as it went along.
The Computing Masters was fun to do and resulted in the following major improvements: firstly, nowadays when I'm in a meeting and I don't know what people are talking about, I'm confident enough to admit it. Secondly, I have the research skills to go and find out more about the thing I don't know about. I'm pretty sure I could have gained these skills without doing a Masters, too - but (as several others have mentioned here) it's the confidence that makes the difference, however you get it.
Since then, I've been a team lead at a Finance Company and (just about) managed to hold that down. I also came to the conclusion that the brash, "confident" (i.e. egotistical) developers were the dangerous ones, who always seemed to be followed around by a cloud of disaster - their "confidence" was usually utter BS. Also, fundamentally, whether you know "Framework X" or "Foundation Y" should always be secondary to whether you know how to code well in a team - to which end, I recommend that you read both Clean Code and The Clean Coder by "Uncle" Bob Martin. And learn how to write good tests.
As I say - the fact that you're being conscientious about this is a good indicator that you'll be OK. Best of luck.