工欲善其事必先利其器,我們先來(lái)看一下什么是ChatGPT。小試牛刀,讓ChatGPT自己來(lái)回答一下:
從介紹中可以看出來(lái)ChatGPT很擅長(zhǎng)處理自然語(yǔ)言,那我們來(lái)看看AI處理編程語(yǔ)言的效果如何呢?
第一個(gè)挑戰(zhàn),讓ChatGPT實(shí)現(xiàn)一個(gè)分布式鎖。在這里我指定了中間件使用Redis、編程語(yǔ)言使用Java。最終的實(shí)現(xiàn)代碼如下:
import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.DefaultRedisScript;import org.springframework.data.redis.core.script.RedisScript;
import java.util.Collections;
public class DistributedLock {
private RedisTemplate<String, String> redisTemplate;
public DistributedLock(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public boolean acquire(String lockKey, int expireTime) {
RedisScript<String> script = new DefaultRedisScript<>(
"return redis.call('set', KEYS[1], 'locked', 'NX', 'EX', ARGV[1])",
String.class);
String result =redisTemplate.execute(script,Collections.singletonList(lockKey),Integer.toString(expireTime));
return "OK".equals(result);
}
public void release(String lockKey) {
redisTemplate.delete(lockKey);
}
}
而更厲害的是,ChatGPT 給出了實(shí)現(xiàn)思路和使用注意事項(xiàng):
接下來(lái)上點(diǎn)難度,第二個(gè)挑戰(zhàn)是讓ChatGPT對(duì)接騰訊云接口,在告訴ChatGPT騰訊云發(fā)送短信API的文檔鏈接、使用spring注解方式等信息后,馬上就有結(jié)果了:
<dependencies>
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.63</version>
</dependency>
</dependencies>
然后,在你的 Spring Boot 應(yīng)用程序中,你需要定義 SmsClient
的 Bean,并使用 @Configuration
和 @Bean
注解將其設(shè)置為單例模式。比如,可以在一個(gè)名為 TencentCloudConfig
的類中添加如下代碼:
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configurationpublic class TencentCloudConfig {
@Value("${tencentcloud.secretId}")
private String secretId;
@Value("${tencentcloud.secretKey}")
private String secretKey;
@Value("${tencentcloud.sms.appid}")
private String smsSdkAppid;
@Value("${tencentcloud.sms.sign}")
private String sign;
@Bean
public SmsClient smsClient() {
Credential cred = new Credential(secretId, secretKey);
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("sms.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
return new SmsClient(cred, "", clientProfile);
}
}
最后,我們?cè)?SmsService
類中注入 SmsClient
的 Bean,進(jìn)行短信發(fā)送的操作。比如,可以在 SmsService
類中添加如下代碼:
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Servicepublic
class SmsService {
@Autowired
private SmsClient smsClient;
public void sendSms(String phoneNumber, String templateId, String[] templateParams) {
// 創(chuàng)建 SendSmsRequest 對(duì)象
SendSmsRequest req = new SendSmsRequest();
req.setSmsSdkAppid("你的短信應(yīng)用 SDK AppID");
req.setSign("短信簽名內(nèi)容");
req.setTemplateID(templateId);
req.setPhoneNumberSet(new String[] {phoneNumber});
req.setTemplateParamSet(templateParams);
// 發(fā)送短信
try {
SendSmsResponse resp = smsClient.SendSms(req);
System.out.println(resp.toString());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
看來(lái)寫代碼難不倒ChatGPT。接下來(lái)看看它改bug的能力吧。
發(fā)送一段有 bug 的代碼給 ChatGPT:
class Account {
private int balance;
// 轉(zhuǎn)賬
void transfer(Account target, int amt){
// 鎖定轉(zhuǎn)出賬戶
synchronized(this){
// 鎖定轉(zhuǎn)入賬戶
synchronized(target){
if (this.balance > amt) {
this.balance -= amt;
target.balance += amt;
}
}
}
}
}
class Account {
private int balance;
private static final Object lock = new Object();
// 轉(zhuǎn)賬
void transfer(Account target, int amt){
// 獲取鎖順序
Account first = this;
Account second = target;
if (this.hashCode() > target.hashCode()) {
first = target;
second = this;
}
// 鎖定轉(zhuǎn)出賬戶
synchronized(first){
// 鎖定轉(zhuǎn)入賬戶
synchronized(second){
if (this.balance > amt) {
this.balance -= amt;
target.balance += amt;
}
}
}
}
}
在這個(gè)修復(fù)后的版本中,使用了一個(gè)靜態(tài)的鎖對(duì)象來(lái)避免不必要的競(jìng)爭(zhēng)。同時(shí),還根據(jù)賬戶的哈希值來(lái)決定獲取鎖的順序,從而避免了死鎖問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-418858.html
看到這里,你覺(jué)得ChatGPT表現(xiàn)得怎么樣呢。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-418858.html
到了這里,關(guān)于ChatGPT不僅能寫代碼還能改bug,這屆AI全能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!