Q:參加 Go 進階訓練營,須要具有什麼基礎?
須要掌握 Go 語言基礎語法,並具有必定的 Go 語言相關項目開發經驗。html
Q:學完課程後能到什麼水平?
Go 進階訓練營課程設計對標字節跳動 2-2 級勝任力模型,教學貼近大廠真實場景。課程中的實踐驅動,不只能夠系統提高你的代碼硬實力,同時也會培養你進入一線互聯網大廠必備的思惟能力。
咱們的課程培養目標是大廠的資深 Go 工程師、高級 Go 開發工程師、Go 技術專家。按照老師系統性的規劃,用心學習,能夠幫你擺脫低效和痛苦的自學,事半功倍,學完後能夠達到一線互聯網大廠中高級 Go 開發工程師的水平。json
哪些人適合報名 Go 進階訓練營?ide
2 年以上工做經驗,在理論和技術方面有進階學習需求的 Go 語言工程師;
其它語言轉 Go(好比 Java )的工程師,用 Go 寫過簡單的項目,但工做中用 Go 寫中大型的複雜項目比較吃力
SQL注入學習
SQL注入是效勞器端未嚴厲校驗客戶端發送的數據,而招致效勞端SQL語句被歹意修正並勝利執行的行爲。url
實質:把用戶輸入的數據當做代碼執行。任何和數據庫產生交互的中央便有可能存在注入.設計
SQL注入類型
數據傳輸: GET POST COOKIEcode
數據類型: 整型 字符型orm
注入形式: 結合查詢 報錯 佈爾盲注 時間盲注 推查詢htm
SQL注入的普通步驟
判別可否有注入
可控參數的改動可否影響頁面的結果。
輸入的SQL語句可否能報錯.---->經過數據庫報錯,看到數據庫的語句痕跡。
輸入的SQL語句可否不報錯.---->語句能夠勝利閉合。
判別注入類型
語句可否能夠被歹意修正
可否能夠執行
獲取我們想要的數據
SQL注入的根底學問
數據庫構造
數據庫---->表---->字段---->值索引
SQL5.0版本之後MySQL默許在數據庫中寄存一個「information_schema」的數據庫,在該庫中有三個重要的表名schemata,tables,columns。
schemata表存儲該用戶創立的一切數據庫的庫名,字段名爲schema_name。
tables表存儲該用戶創立的一切數據庫的庫名和表名,數據庫庫名和表名字段分別爲table_schema,table_name。
columns表存儲一切的庫名,表名,字段名,它們的字段名分別爲table_schema,table_name,column_name。
查詢語句
select 要查詢的字段名 from 庫名.表名
select 要查詢的字段名 from 庫名.表名 where 已知條件的字段名 = '已知條件的值'
select 要查詢的字段名 from 庫名.表名 where 已知的條件字段名1 = '已知條件的值1' and 已知條件2的字段名 = '已知條件2的值'
limit用法
limit m,n
m表示記載開端的位置,從0開端表示第一條記載;n指取n條記載。
重要的函數
database() 當前網站運用的數據庫。
version() 當前的MySQL版本。
user() 當前MySQL的用戶。
@@datadir 數據庫途徑。
@@version_compile_os 操做係統版本
concat(str1,str2,...) 沒有分隔符地銜接字符串
concat_ws(separator,str1,str2,...) 含有分隔符地銜接字符串
group_concat(str1,str2,...) 銜接一個組的一切字符串,並以逗號分隔每一條數據
註釋符
常見的註釋表達方式爲:# --空格 /**/
在url中表示爲: %23 --+
對條件字段作函數操做走不了索引。
select * from t1 where date© =‘2019-05-21’;
優化:改爲範圍查詢
select * from t1 where c>=‘2019-05-21 00:00:00’ and c<=‘2019-05-21 23:59:59’;
隱式轉換
操做符與不一樣類型的操做對象一同運用時,就會發做類型轉換以使操做兼容。
select user_name,tele_phone from user_info where tele_phone =11111111111; / tele_phone varchar /
實踐會作函數操做:
select user_name,tele_phone from user_info where cast(tele_phone as singed int) =11111111111;
優化:類型統一
select user_name,tele_phone from user_info where tele_phone =‘11111111111’;
含糊查詢
通配符在前面
select * from t1 where a like ‘%1111%’;
優化:含糊查詢必需包含條件字段前面的值
select * from t1 where a like ‘1111%’;
範圍查詢
範圍查詢數據量太多,需求回表,於是不走索引。
select * from t1 where b>=1 and b <=2000;
優化:下降單次查詢範圍,分屢次查詢。(實踐可能速度沒得快太多,倡議走索引)
select from t1 where b>=1 and b <=1000;
show profiles;
±---------±-----------±-----------------------------------------+
| Query_ID | Duration | Query |
±---------±-----------±-----------------------------------------+
| 1 | 0.00534775 | select from t1 where b>=1 and b <=1000 |
| 2 | 0.00605625 | select * from t1 where b>=1 and b <=2000 |
±---------±-----------±-----------------------------------------+
2 rows in set, 1 warning (0.00 sec)
計算操做
即使是簡單的計算
explain select * from t1 where b-1 =1000;
優化:將計算操做放在等號後面
explain select * from t1 where b =1000 + 1;
在MongoDB中OjbectId 類型Json序列化反序列化會出錯,能夠經過如下兩種方式解決
一、最簡單粗暴的方法,重新定一個一個業務主鍵好比key,這樣的話等於以前的_id不起做用了
二、使用JsonConverter
public class ObjectIdConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ObjectId);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.String) { throw new Exception( String.Format("Unexpected token parsing ObjectId. Expected String, got {0}.", reader.TokenType)); } var value = (string)reader.Value; return String.IsNullOrEmpty(value) ? ObjectId.Empty : new ObjectId(value); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { if (value is ObjectId) { var objectId = (ObjectId)value; writer.WriteValue(objectId != ObjectId.Empty ? objectId.ToString() : String.Empty); } else { throw new Exception("Expected ObjectId value."); } } }
在ObjectId字段上加一行代碼便可
[JsonConverter(typeof(ObjectIdConverter))]
public string _id { get; set; }
若是使用Newtonsoft的JsonConvert的話,還須要額外加上參數
JsonConvert.DeserializeObject<xxxx>(json,new ObjectIdConverter());
三、經過Ignore,一種頗有技巧性的寫法
[JsonIgnore]
public override ObjectId _Id { get; set; }
[BsonIgnore]public string _IdStr{get{return Id.ToString();}set{ObjectId id;ObjectId.TryParse(value, out id);Id = id;}}