go-dogle是一个轻量级、语义化、对开发者友好的golag编码解码、加密解密库。
如果您觉得不错,请给个star吧github.com/golag-module/doglegitee.com/golag-module/dogle安装使用
//使用github库goget-ugithub.com/golag-module/dogleimport("github.com/golag-module/dogle")//使用gitee库goget-ugitee.com/golag-module/dogleimport("gitee.com/golag-module/dogle")用法示例
Hex编码、解码
//对字符串进行hex编码,输出字符串dogle.Ecode.FromStrig("helloworld").ByHex().ToStrig()//68656c6c6f20776f726c64//对字符串进行hex解码,输出字符串dogle.Decode.FromStrig("68656c6c6f20776f726c64").ByHex().ToStrig()//helloworld//对字节切片进行hex编码,输出字符串dogle.Ecode.FromBytes([]byte("helloworld")).ByHex().ToStrig()//68656c6c6f20776f726c64//对字节切片进行hex解码,输出字符串dogle.Decode.FromBytes([]byte("68656c6c6f20776f726c64")).ByHex().ToStrig()//helloworld//对字符串进行hex编码,输出字节切片dogle.Ecode.FromStrig("helloworld").ByHex().ToBytes()//[]byte("68656c6c6f20776f726c64")//对字符串进行hex解码,输出字节切片dogle.Decode.FromStrig("68656c6c6f20776f726c64").ByHex().ToBytes()//[]byte("helloworld")//对字节切片进行hex编码,输出字节切片dogle.Ecode.FromBytes([]byte("helloworld")).ByHex().ToBytes()//[]byte("68656c6c6f20776f726c64")//对字节切片进行hex解码,输出字节切片dogle.Decode.FromBytes([]byte("68656c6c6f20776f726c64")).ByHex().ToBytes()//[]byte("helloworld")Base32编码、解码
//对字符进行base32编码,输出字符串dogle.Ecode.FromStrig("helloworld").ByBase32().ToStrig()//NBSWY3DPEB3W64TMMQ======//对字符串进行base32解码,输出字符串dogle.Decode.FromStrig("NBSWY3DPEB3W64TMMQ======").ByBase32().ToStrig()//helloworld//对字节切片进行base32编码,输出字符串dogle.Ecode.FromBytes([]byte("helloworld")).ByBase32().ToStrig()//NBSWY3DPEB3W64TMMQ======//对字节切片进行base32解码,输出字符串dogle.Decode.FromBytes([]byte("NBSWY3DPEB3W64TMMQ======")).ByBase32().ToStrig()//helloworld//对字符串进行base32编码,输出字节切片dogle.Ecode.FromStrig("helloworld").ByBase32().ToBytes()//[]byte("NBSWY3DPEB3W64TMMQ======")//对字符串进行base32解码,输出字节切片dogle.Decode.FromStrig("NBSWY3DPEB3W64TMMQ======").ByBase32().ToBytes()//[]byte("helloworld")//对字节切片进行base32编码,输出字节切片dogle.Ecode.FromBytes([]byte("helloworld")).ByBase32().ToBytes()//[]byte("NBSWY3DPEB3W64TMMQ======")//对字节切片进行base32解码,输出字节切片dogle.Decode.FromBytes([]byte("NBSWY3DPEB3W64TMMQ======")).ByBase32().ToBytes()//[]byte("helloworld")Base64编码、解码
//对字符串进行base64编码,输出字符串dogle.Ecode.FromStrig("helloworld").ByBase64().ToStrig()//aGVsbG8gd29ybGQ=//对字符串进行base64解码,输出字符串dogle.Decode.FromStrig("aGVsbG8gd29ybGQ=").ByBase64().ToStrig()//helloworld//对字节切片进行base64编码,输出字符串dogle.Ecode.FromBytes([]byte("helloworld")).ByBase64().ToStrig()//aGVsbG8gd29ybGQ=//对字节切片进行base64解码,输出字符串dogle.Decode.FromBytes([]byte("aGVsbG8gd29ybGQ=")).ByBase64().ToStrig()//helloworld//对字符串进行base64编码,输出字节切片dogle.Ecode.FromBytes([]byte("helloworld")).ByBase64().ToStrig()//aGVsbG8gd29ybGQ=//对字符串进行base64解码,输出字节切片dogle.Decode.FromStrig("aGVsbG8gd29ybGQ=").ByBase64().ToBytes()//[]byte("helloworld")//对字节切片进行base64编码,输出字节切片dogle.Ecode.FromStrig("helloworld").ByBase64().ToBytes()//[]byte("aGVsbG8gd29ybGQ=")//对字节切片进行base64解码,输出字节切片dogle.Decode.FromBytes([]byte("aGVsbG8gd29ybGQ=")).ByBase64().ToBytes()//[]byte("helloworld")Base64URL编码、解码
//对url字符进行base64编码,输出字符串dogle.Ecode.FromStrig("www.gouguoyi.c").ByBase64URL().ToStrig()//d3d3LmdvdWd1b3lpbi5jbg==//对url字符进行base64解码,输出字符串dogle.Decode.FromStrig("d3d3LmdvdWd1b3lpbi5jbg==").ByBase64URL().ToStrig()//www.gouguoyi.c//对url字节切片进行base64编码,输出字符串dogle.Ecode.FromBytes([]byte("www.gouguoyi.c")).ByBase64URL().ToStrig()//d3d3LmdvdWd1b3lpbi5jbg==//对url字节切片进行base64解码,输出字符串dogle.Decode.FromBytes([]byte("d3d3LmdvdWd1b3lpbi5jbg==")).ByBase64URL().ToStrig()//www.gouguoyi.c//对url字符进行base64编码,输出字节切片dogle.Ecode.FromStrig("www.gouguoyi.c").ByBase64URL().ToBytes()//[]byte("d3d3LmdvdWd1b3lpbi5jbg==")//对url字符进行base64解码,输出字节切片dogle.Decode.FromStrig("d3d3LmdvdWd1b3lpbi5jbg==").ByBase64URL().ToBytes()//[]byte("www.gouguoyi.c")//对url字节切片进行base64编码,输出字节切片dogle.Ecode.FromBytes([]byte("www.gouguoyi.c")).ByBase64URL().ToBytes()//[]byte("d3d3LmdvdWd1b3lpbi5jbg==")//对url字符进行base64解码,输出字节切片dogle.Decode.FromBytes([]byte("d3d3LmdvdWd1b3lpbi5jbg==")).ByBase64URL().ToBytes()//[]byte("www.gouguoyi.c")SafeURL编码、解码
//对url字符进行转义编码,输出字符串dogle.Ecode.FromStrig("www.gouguoyi.c?sex=男&age=18").BySafeURL().ToStrig()//www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18//对url字符进行转义解码,输出字符串dogle.Decode.FromStrig("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18").BySafeURL().ToStrig()//www.gouguoyi.c?sex=男&age=18//对url字节切片进行转义编码,输出字符串dogle.Ecode.FromBytes([]byte("www.gouguoyi.c?sex=男&age=18")).BySafeURL().ToStrig()//www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18//对url字节切片进行转义解码,输出字符串dogle.Decode.FromBytes([]byte("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18")).BySafeURL().ToStrig()//www.gouguoyi.c?sex=男&age=18//对url字符进行转义编码,输出字节切片dogle.Ecode.FromStrig("www.gouguoyi.c?sex=男&age=18").BySafeURL().ToBytes()//[]byte("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18")//对url字符进行转义解码,输出字节切片dogle.Decode.FromStrig("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18").BySafeURL().ToBytes()//[]byte("www.gouguoyi.c?sex=男&age=18")//对url字节切片进行转义编码,输出字节切片dogle.Ecode.FromBytes([]byte("www.gouguoyi.c?sex=男&age=18")).BySafeURL().ToBytes()//[]byte("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18")//对url字符进行转义解码,输出字节切片dogle.Decode.FromBytes([]byte("www.gouguoyi.c%3Fsex%3D%E7%94%B7%26age%3D18")).BySafeURL().ToBytes()//[]byte("www.gouguoyi.c?sex=男&age=18")Md4加密
//对字符串进行md4加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd4().ToHexStrig()//aa010fbc1d14c795d86ef98c95479d17//对字符串进行md4加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd4().ToBase32Strig()//VIAQ7PA5CTDZLWDO7GGJKR45C4======//对字符串进行md4加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd4().ToBase64Strig()//qgEPvB0Ux5XYbvmMlUedFw==//对字节切片进行md4加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd4().ToHexBytes()//[]byte("aa010fbc1d14c795d86ef98c95479d17")//对字节切片进行md4加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd4().ToBase32Bytes()//[]byte("VIAQ7PA5CTDZLWDO7GGJKR45C4======")//对字节切片进行md4加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd4().ToBase64Bytes()//[]byte("qgEPvB0Ux5XYbvmMlUedFw==")//对文件进行md4加密,输出经过hex编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd4().ToHexStrig()//1240c5c0fb26b585999357915c56b511//对文件进行md4加密,输出经过base32编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd4().ToBase32Strig()//CJAMLQH3E22YLGMTK6IVYVVVCE======//对文件进行md4加密,输出经过base64编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd4().ToBase64Strig()//EkDFwPsmtYWZk1eRXFa1EQ==//对文件进行md4加密,输出经过hex编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd4().ToHexBytes()//[]byte("1240c5c0fb26b585999357915c56b511")//对文件进行md4加密,输出经过base32编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd4().ToBase32Bytes()//[]byte("CJAMLQH3E22YLGMTK6IVYVVVCE======")//对文件进行md4加密,输出经过base64编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd4().ToBase64Bytes()//[]byte("EkDFwPsmtYWZk1eRXFa1EQ==")Hmac-md4加密
//对字符串进行hmac-md4加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd4("dogle").ToHexStrig()//7a9df5247cbf76a8bc17c9c4f5a75b6b//对字符串进行hmac-md4加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd4("dogle").ToBase32Strig()//PKO7KJD4X53KRPAXZHCPLJ23NM======//对字符串进行hmac-md4加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd4("dogle").ToBase64Strig()//ep31JHy/dqi8F8E9adbaw==//对字节切片进行hmac-md4加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd4([]byte("dogle")).ToHexBytes()//[]byte("7a9df5247cbf76a8bc17c9c4f5a75b6b")//对字节切片进行hmac-md4加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd4([]byte("dogle")).ToBase32Bytes()//[]byte("PKO7KJD4X53KRPAXZHCPLJ23NM======")//对字节切片进行hmac-md4加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd4([]byte("dogle")).ToBase64Bytes()//[]byte("ep31JHy/dqi8F8E9adbaw==")Md5加密
//对字符串进行md5加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd5().ToHexStrig()//5eb63bbbe01eeed093cb22bb8f5acdc3//对字符串进行md5加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd5().ToBase32Strig()//L23DXO7AD3XNBE6LEK5Y6WWNYM======//对字符串进行md5加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByMd5().ToBase64Strig()//XrY7u+Ae7tCTyyK7j1rNww==//对字节切片进行md5加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd5().ToHexBytes()//[]byte("5eb63bbbe01eeed093cb22bb8f5acdc3")//对字节切片进行md5加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd5().ToBase32Bytes()//[]byte("L23DXO7AD3XNBE6LEK5Y6WWNYM======")//对字节切片进行md5加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByMd5().ToBase64Bytes()//[]byte("XrY7u+Ae7tCTyyK7j1rNww==")//对文件进行md5加密,输出经过hex编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd5().ToHexStrig()//014f03f9025ea81a8a0e9734be540c53//对文件进行md5加密,输出经过base32编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd5().ToBase32Strig()//AFHQH6ICL2UBVCQOS42L4VAMKM======//对文件进行md5加密,输出经过base64编码的字符串dogle.Ecrypt.FromFile("./LICENSE").ByMd5().ToBase64Strig()//AU8D+QJeqBqKDpc0vlQMUw==//对文件进行md5加密,输出经过hex编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd5().ToHexBytes()//[]byte("014f03f9025ea81a8a0e9734be540c53")//对文件进行md5加密,输出经过base32编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd5().ToBase32Bytes()//[]byte("AFHQH6ICL2UBVCQOS42L4VAMKM======")//对文件进行md5加密,输出经过base64编码的字节切片dogle.Ecrypt.FromFile([]byte("./LICENSE")).ByMd5().ToBase64Bytes()//[]byte("AU8D+QJeqBqKDpc0vlQMUw==")Hmac-md5加密
//对字符串进行hmac-md5加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd5("dogle").ToHexStrig()//4790626a275f776956386e5a3ea7b726//对字符串进行hmac-md5加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd5("dogle").ToBase32Strig()//I6IGE2RHL53WSVRYNZND5J5XEY======//对字符串进行hmac-md5加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacMd5("dogle").ToBase64Strig()//R5Biaidfd2lWOG5aPqe3Jg==//对字节切片进行hmac-md5加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd5([]byte("dogle")).ToHexBytes()//[]byte("4790626a275f776956386e5a3ea7b726")//对字节切片进行hmac-md5加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd5([]byte("dogle")).ToBase32Bytes()//[]byte("I6IGE2RHL53WSVRYNZND5J5XEY======")//对字节切片进行hmac-md5加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacMd5([]byte("dogle")).ToBase64Bytes()//[]byte("R5Biaidfd2lWOG5aPqe3Jg==")Sha1加密
//对字符串进行sha1加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").BySha1().ToHexStrig()//2aae6c35c94fcfb415dbe95f408b9ce91ee846ed//对字符串进行sha1加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").BySha1().ToBase32Strig()//FKXGYNOJJ7H3IFO35FPUBC445EPOQRXN//对字符串进行sha1加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").BySha1().ToBase64Strig()//Kq5sNclPz7QV2+lfQIuc6R7oRu0=//对字节切片进行sha1加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).BySha1().ToHexBytes()//[]byte("2aae6c35c94fcfb415dbe95f408b9ce91ee846ed")//对字节切片进行sha1加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).BySha1().ToBase32Bytes()//[]byte("FKXGYNOJJ7H3IFO35FPUBC445EPOQRXN")//对字节切片进行sha1加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).BySha1().ToBase64Bytes()//[]byte("Kq5sNclPz7QV2+lfQIuc6R7oRu0=")Hmac-sha1加密
//对字符串进行hmac-sha1加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacSha1("dogle").ToHexStrig()//91c103ef93ba7420902b0d1bf0903251c94b4a62//对字符串进行hmac-sha1加密,输出经过base22编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacSha1("dogle").ToBase32Strig()//SHAQH34TXJ2CBEBLBUN7BEBSKHEUWSTC//对字符串进行hmac-sha1加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByHmacSha1("dogle").ToBase64Strig()//kcED75O6dCCQKw0b8JAyUclLSmI=//对字节切片进行hmac-sha1加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacSha1([]byte("dogle")).ToHexBytes()//[]byte("91c103ef93ba7420902b0d1bf0903251c94b4a62")//对字节切片进行hmac-sha1加密,输出经过base22编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacSha1([]byte("dogle")).ToBase32Bytes()//[]byte("SHAQH34TXJ2CBEBLBUN7BEBSKHEUWSTC")//对字节切片进行hmac-sha1加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByHmacSha1([]byte("dogle")).ToBase64Bytes()//[]byte("kcED75O6dCCQKw0b8JAyUclLSmI=")Rc4加密
//对字符串进行rc4加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByRc4("dogle").ToHexStrig()//eba154b4cb5a9038dbbf9d//对字符串进行rc4加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByRc4("dogle").ToBase32Strig()//5OQVJNGLLKIDRW57TU======//对字符串进行rc4加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByRc4("dogle").ToBase64Strig()//66FUtMtakDjbv50=//对字节切片进行rc4加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByRc4("dogle").ToHexBytes()//[]byte("eba154b4cb5a9038dbbf9d")//对字节切片进行rc4加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByRc4("dogle").ToBase32Bytes()//[]byte("5OQVJNGLLKIDRW57TU======")//对字节切片进行rc4加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByRc4("dogle").ToBase64Bytes()//[]byte("66FUtMtakDjbv50=")Aes加密、解密
cipher:=NewCipher()cipher.SetMode(dogle.CBC)//CBC、ECB、CFB、OFB、CTR、GCMcipher.SetPaddig(dogle.PKCS7)//No、Zero、PKCS5、PKCS7cipher.SetKey("1234567887654321")//key长度必须是16、24或32cipher.SetIV("1234567887654321")//iv长度必须是16、24或32//对字符串进行aes加密,输出经过hex编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByAes(cipher).ToHexStrig()//65d823bdf1c581a1ded1cba42e03ca52//对经过hex编码的字符串进行aes解密,输出字符串dogle.Decrypt.FromHexStrig("65d823bdf1c581a1ded1cba42e03ca52").ByAes(cipher).ToStrig()//helloworld//对字符串进行aes加密,输出经过base32编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByAes(cipher).ToBase32Strig()//MXMCHPPRYWA2DXWRZOSC4A6KKI======//对经过base32编码的字符串进行aes解密,输出字符串dogle.Decrypt.FromBase32Strig("MXMCHPPRYWA2DXWRZOSC4A6KKI======").ByAes(cipher).ToStrig()//helloworld//对字符串进行aes加密,输出经过base64编码的字符串dogle.Ecrypt.FromStrig("helloworld").ByAes(cipher).ToBase64Strig()//ZdgjvfHFgaHe0cukLgPKUg==//对经过base64编码的字符串进行aes解密,输出字符串dogle.Decrypt.FromBase64Strig("ZdgjvfHFgaHe0cukLgPKUg==").ByAes(cipher).ToStrig()//helloworld//对字节切片进行aes加密,输出经过hex编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByAes(cipher).ToHexBytes()//[]byte("65d823bdf1c581a1ded1cba42e03ca52")//对经过hex编码的字符串进行aes解密,输出字符串dogle.Decrypt.FromHexBytes([]byte("65d823bdf1c581a1ded1cba42e03ca52")).ByAes(cipher).ToBytes()//[]byte("helloworld")//对字节切片进行aes加密,输出经过base32编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByAes(cipher).ToBase32Bytes()//[]byte("MXMCHPPRYWA2DXWRZOSC4A6KKI======")//对经过base32编码的字节切片进行aes解密,输出字节切片dogle.Decrypt.FromBase32Bytes([]byte("MXMCHPPRYWA2DXWRZOSC4A6KKI======")).ByAes(cipher).ToBytes()//[]byte("helloworld")//对字节切片进行aes加密,输出经过base64编码的字节切片dogle.Ecrypt.FromBytes([]byte("helloworld")).ByAes(cipher).ToBase64Bytes()//[]byte("ZdgjvfHFgaHe0cukLgPKUg==")//对经过base64编码的字节切片进行aes解密,输出字节切片dogle.Decrypt.FromBase64Bytes(()byte("ZdgjvfHFgaHe0cukLgPKUg==")).ByAes(cipher).ToBytes()//[]byte("helloworld")错误处理
如果有多个错误发生,只返回第一个错误,前一个错误排除后才返回下一个错误
e:=dogle.Ecrypy.FromFile("./demo.txt").ByMd5()ife.Error!=il{//错误处理...log.Fatal(e.Error)}fmt.Pritl(e.ToStrig())//输出ivalidfile"./demo.txt",pleasemakesurethefileexists更多用法请查看下方软件文档
评论