-
-
Notifications
You must be signed in to change notification settings - Fork 709
Add solution for Challenge 3 by ansmonjol #753
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughA new Go solution file is introduced for Challenge 3, implementing Employee and Manager types with methods to add employees, remove employees by ID, calculate average salary, and find employees by ID, plus a main function demonstrating these operations. Changes
Sequence DiagramsequenceDiagram
participant main
participant manager as Manager
participant employees as Employee[]
main->>manager: Create Manager
main->>manager: AddEmployee(emp1)
manager->>employees: Append emp1
main->>manager: AddEmployee(emp2)
manager->>employees: Append emp2
main->>manager: RemoveEmployee(id)
manager->>employees: Remove matching ID
main->>manager: GetAverageSalary()
manager->>employees: Iterate & sum salaries
manager-->>main: Return average
main->>manager: FindEmployeeByID(id)
manager->>employees: Search by ID
manager-->>main: Return *Employee or nil
main->>main: Print results
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes
Possibly related PRs
Pre-merge checks❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
challenge-3/submissions/ansmonjol/solution-template.go(1 hunks)
🔇 Additional comments (5)
challenge-3/submissions/ansmonjol/solution-template.go (5)
5-10: LGTM! Clean struct definition.The Employee struct is well-defined with appropriate field types.
12-14: LGTM! Clean struct definition.The Manager struct appropriately uses a slice to hold employees.
16-19: LGTM! Correct implementation.The AddEmployee method correctly uses append with a pointer receiver to modify the manager's employee list.
30-43: LGTM! Correct average calculation.The method properly handles the empty case and calculates the average salary correctly with appropriate type conversion.
56-68: LGTM! Good demonstration of the API.The main function appropriately demonstrates the usage of the Manager and Employee types. However, the actual runtime behavior will be affected by the critical bugs in
RemoveEmployeeandFindEmployeeByIDflagged above.
| // RemoveEmployee removes an employee by ID from the manager's list. | ||
| func (m *Manager) RemoveEmployee(id int) { | ||
| for index, value := range m.Employees { | ||
| if id == value.ID { | ||
| m.Employees = append(m.Employees[:index], m.Employees[index+1:]...) | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: Missing break/return after slice modification during iteration.
Modifying a slice during a range loop without breaking is unsafe. After removing an element at index, the slice is shortened and subsequent elements shift left, but the range loop continues with stale iteration state. This can skip elements or cause unexpected behavior.
Apply this diff to fix the issue by adding a return statement:
func (m *Manager) RemoveEmployee(id int) {
for index, value := range m.Employees {
if id == value.ID {
m.Employees = append(m.Employees[:index], m.Employees[index+1:]...)
+ return
}
}
}Alternatively, if multiple employees might share the same ID, iterate backwards:
func (m *Manager) RemoveEmployee(id int) {
for i := len(m.Employees) - 1; i >= 0; i-- {
if m.Employees[i].ID == id {
m.Employees = append(m.Employees[:i], m.Employees[i+1:]...)
}
}
}🤖 Prompt for AI Agents
In challenge-3/submissions/ansmonjol/solution-template.go around lines 21 to 28,
the RemoveEmployee method modifies the Employees slice inside a range loop which
can skip elements or produce incorrect behavior; fix it by either returning
immediately after the append removal so the loop stops after the first match, or
if duplicate IDs must be removed, rewrite the loop to iterate backwards from
len(m.Employees)-1 down to 0 and perform the append removal for each matching
index.
| // FindEmployeeByID finds and returns an employee by their ID. | ||
| func (m *Manager) FindEmployeeByID(id int) *Employee { | ||
| for _, e := range m.Employees { | ||
| if e.ID == id { | ||
| return &e | ||
| } | ||
| } | ||
|
|
||
| return nil | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: Returning address of loop variable.
Returning &e is unsafe because e is the loop variable that is reused for each iteration. The address remains the same across all iterations, so you're returning a pointer to a temporary that may contain stale or incorrect data after the loop exits.
Apply this diff to fix by using an indexed loop:
func (m *Manager) FindEmployeeByID(id int) *Employee {
- for _, e := range m.Employees {
- if e.ID == id {
- return &e
+ for i := range m.Employees {
+ if m.Employees[i].ID == id {
+ return &m.Employees[i]
}
}
return nil
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // FindEmployeeByID finds and returns an employee by their ID. | |
| func (m *Manager) FindEmployeeByID(id int) *Employee { | |
| for _, e := range m.Employees { | |
| if e.ID == id { | |
| return &e | |
| } | |
| } | |
| return nil | |
| } | |
| // FindEmployeeByID finds and returns an employee by their ID. | |
| func (m *Manager) FindEmployeeByID(id int) *Employee { | |
| for i := range m.Employees { | |
| if m.Employees[i].ID == id { | |
| return &m.Employees[i] | |
| } | |
| } | |
| return nil | |
| } |
🤖 Prompt for AI Agents
In challenge-3/submissions/ansmonjol/solution-template.go around lines 45 to 54,
the function returns the address of the loop variable `e`, which is reused
across iterations and leads to incorrect/stale pointers; change to an indexed
loop over m.Employees and return the address of the slice element (e.g.,
&m.Employees[i]) when IDs match so you return a stable pointer to the actual
Employee stored in the slice.
No description provided.